2015-11-20 81 views
1

我有一個單獨的對象下面的方法是在多線程環境中運行(Play 2 JavaMySQLHibernate):Java的Hibernate的多線程

@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 
    } 
    .... 
} 

我有一個很難理解爲什麼有時候還是低於1時同時運行。

回答

0

你的方法不是靜態的,所以你的同步鎖定當前對象只有synchronized(this)

我想這個方法不是來自單例對象,所以你可以同時擁有4個這樣的對象(4個客戶端連接異步調用的4個不同線程),其中3個調用'deleteItem'。 ..你在一瞬間得到了-3。

您需要同步類synchronize(MyDb.class)或將此對象轉換爲單例。

+0

這實際上是一個單身物件的方法。對不起,我沒有提到它 – user2934804