簡體   English   中英

Java中Collections.synchronizedMap的基礎

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM