我使用類似同步緩存的項目
Cache<Integer, Item> cache;
其中Item
s爲相互獨立的,看起來像
private static class Item {
private final int id;
... some mutable data
synchronized doSomething() {...}
synchronized doSomethingElse() {...}
}
這樣做是爲了獲得從緩存中的項目,調用一個同步的方法。如果遺漏,該項目可以重新創建,沒關係。
當某個項目從緩存中被逐出並在線程運行同步方法時重新創建時會出現問題。一個新線程獲得一個新項目並在其上進行同步......因此,對於單個id
,同步方法內有兩個線程。失敗。
有沒有簡單的方法呢?它是Guava Cache,如果有幫助。
我可能會嘗試使用一個單獨的條紋''獲取每個鍵鎖? –
如果項目較少相比,在高速緩存中的項目總數,如果在項目對象中的可變數據進行更新的數量不是太大,那麼怎麼樣同步的項目對象的深克隆,然後原子地更新可變緩存中相應項目中的數據。 – akki