2012-10-12 68 views
1

持久裝載機我必須從以下方法持久性項目加載類:同步在java中

Item loadItem(int id); 

所以現在我想實施其他控制器的以下方法:

synchronized Item getItem(int id){ 
    Item result= getItemFromMemory(id); 
    if (result==null){ 
     result=PersistenceController.loadItem(id); 
    } 
    return result; 
} 

目標是確保同時在內存中只有一個具有相同ID的項目的實例(或零個)。此方法有效,但有一個問題:每個加載項必須等待對方。我想改變同步方案,以便只有在兩個ID都相同的情況下才能進行呼叫等待。

最好的辦法是做什麼?

+0

然後你必須對id進行鎖定。看到這個答案 [1]:http://stackoverflow.com/questions/659915/synchronizing-on-an-integer-value – MLN

+0

你的ids真的表示爲int基元?如果你爲你的id類使用一個對象,你可以在ID對象本身上進行同步,而不是同步getItem方法。 – Luhar

+0

我不知道你可以從一個整數中獲取互斥量。我有一個關於它的問題?如果在程序的另一部分使用相同的技術(用於其他不相關的任務)和ID碰撞?這可能以不正確的等待權利結束?我正在考慮使用SparseArray 來處理鎖定是否正確? – Addev

回答

1

我想只有達到你想要什麼樣的方式是Custom Lock使用AbstractQueuedSynchronizer將基於整數傳遞創建鎖來寫,但強烈建議不要

Synchronizing on an Integer value提供了使用ConcurrentHashMap解決方案,但它有自己的缺陷。當您獲得相同的鎖定時,無法刪除地圖中的值,因此除非您寫出您不想要的ConcurrentHashMapSynchronized實例,否則無法刪除值。

一個比較可行的方法是增加鎖的數量。