簡體   English   中英

遍歷值時的HashMap線程安全

[英]HashMap threadsafety when iterating over values

有沒有什么優雅的方法可以使HashMap.values()線程安全地迭代,而無需復制基礎地圖?

干杯。

1)HashMap的唯一可能性是完全同步對地圖的所有訪問。

2)使用線程安全的ConcurrentHashMap(無需在內部完全同步)

Java中的Collections類包含使各種集合同步的方法。 在您的情況下,您應該像這樣使用synchronizedMap()方法

mySyncedMap = Collections.synchronizedMap(myMap);

重要的是要注意,此方法在地圖周圍放置了一個包裝器,但是如果保留對它的引用,仍可以訪問基礎地圖。

另一個選擇是使用ConcurrentHashMap類,如其他答案中所述。

我真的不同意R.Moeller的回答。 使用ConcurrentHashMap您不會在迭代時獲得ConcurrentModificationExceptions ,但仍不認為它是線程安全的(請參見注釋)。

盡管我不會復制HashMap,但我會堅持使用復制方法。 如果您有HashMap<K,V> myMap遍歷new ArrayList<V>(myMap.values()) 使其更容易。

另一種方法是使用沒有迭代器的簡單計數循環。

當然,這兩種方法都不是線程安全的,因此您應該包括其他檢查。 同樣,在通過values()時並發添加的元素將不可用。 我認為沒有API解決方案...您必須擴展ConcurrentHashMap ,創建一個考慮刪除和添加的迭代器。 但是我可能在這部分上做錯了,甚至可能做不到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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