2015-11-20 1 views
1

je la méthode suivante dans un objet singleton qui a été exécuté dans un environnement multithread (Play 2 Java, MySQL, Hibernate):Java Hibernate multithread

@Transactional 
void deleteItem(int itemId, int userId) { 
    ..... 
    synchronized(this) { 
    if(getItemCount(userId) < 2) { // go to database to get the count 
     return; 
    } 

    if(!userOwnItem(itemId, userId) { // check if item belongs to user 
     return; 
    } 

    delete(itemId); // go to db to delete the item 
    } 
    .... 
} 

J'ai du mal à comprendre pourquoi parfois il passe en dessous de 1 lorsque courir simultanément.

Répondre

0

Votre méthode n'est pas statique, donc votre synchronisation se verrouille sur l'objet en cours seulement synchronized(this).

Je suppose que cette méthode ne provient pas de l'objet singleton, donc vous pourriez avoir 4 comme objets en même temps (4 clients se connectent sur les 4 threads différents dans les appels asynchrones) et 3 d'entre eux 'deleteItem' .. .. et vous avez -3 dans un instant.

Vous devez synchroniser sur la classe synchronize(MyDb.class) ou convertir cet objet en singleton.

+0

Il s'agit en fait d'une méthode d'un objet singleton. désolé je ne l'ai pas mentionné – user2934804