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