[英]Basics of Collections.synchronizedMap in java
我有一類具有巨大的靜態數據結構的類。 並且許多線程可能正在並行讀取訪問它。 我建議使用Collections.synchronizedMap
私有靜態Map <String,HashSet <String >> HashSets = Collections.synchronizedMap(新的HashMap <String,HashSet <String >>());
根據http://download.oracle.com/javase/6/docs/api/ ,我在訪問值時需要使用synced()關鍵字。我對此不太了解。
我應該如何修改以下訪問權限:
if (HashSets.get (lang).contains (st))
if (HashSets.containsKey (lang) == false)
HashSets.put (lang, testhashset);
任何詳細解釋的鏈接都將很有用。
謝謝,
如果要保護所有小地圖,則每當操作大地圖(或其他方便全局訪問的對象) 時 ,都需要鎖定它們。 只需訪問大地圖本身的單個方法調用就可以了,因為它是同步的。 但是第一個電話必須是
synchronized(HashSets) {
if (HashSets.get(lang).contains(st)) ...
}
您還需要在遍歷任何地圖的鍵時鎖定大地圖,否則會冒ConcurrentModificationException
的風險。
正如另一位海報指出的那樣,這不是一個很好的設計。 即使使它工作,性能也會很差,因為單個大鎖將大大減少並發性。 一個ConcurrentHashMap
幾乎不包含ConcurrentHashMap
會是一個更好的主意。
規范頁面試圖說的是,當您需要對彼此依賴的返回映射進行多次訪問時(例如,迭代),您必須進行同步。 但是單獨立是線程安全和原子的。
因此,在您的情況下,由於您只想在IF操作的條件適用時才執行放置操作,因此應將整個內容包裝在synchronized {}
如下所示:
synchronized(HashSets ){
if (HashSets.get (lang).contains (st))
if (HashSets.containsKey (lang) == false)
HashSets.put (lang, testhashset);
}
ps。 您不應將以大寫字母開頭的變量用作變量名(通用約定)。 HashSets-> hashSets
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.