[英]Is values() of ConcurrentHashMap thread safe?
我是Java8的新手,正在研究一個問題,其中多個線程(〜10)正在將值寫入並行哈希表。 我還有另一個專用線程,該線程讀取並發哈希映射中存在的所有值並返回它們(每30秒一次)。 是否在values()方法的結果上進行迭代是獲取結果的推薦方法,而又沒有獲得並發修改異常?
注意:獲取陳舊數據完全可以
我查看了官方文檔,上面寫着:
檢索操作通常不會阻塞,因此可能與更新操作重疊。 檢索反映了自發生以來最新完成的更新操作的結果。 對於諸如putAll和clear的聚合操作,並發檢索可能僅反映某些條目的插入或刪除。 同樣,迭代器,拆分器和枚舉返回的元素反映了在創建迭代器/枚舉時或此后某個時刻哈希表的狀態。 他們不拋出ConcurrentModificationException。
但是values()方法的doc說:
返回此映射中包含的值的Collection視圖
以下代碼線程安全嗎?
for (String name: myMap.values()) {
System.out.println("name": + name);
}
是否在
values()
方法的結果上進行迭代是獲取結果而不建議您獲取ConcurrentModificationException
的推薦方法?
是。 這是推薦的方法,您不會收到ConcurrentModificationException
。
正如包級javadoc所述:
大多數並發的Collection實現(包括大多數Queue)也與通常的java.util約定不同,它們的迭代器和拆分器提供了弱一致性而不是快速失敗遍歷:
- 他們可能會與其他操作同時進行
- 他們永遠不會拋出
ConcurrentModificationException
- 它們被保證可以遍歷在構造時已經存在的元素一次,並且可以(但不保證)反映出構造后的任何修改。
以下代碼線程安全嗎?
for (String name: myMap.values()) { System.out.println("name": + name); }
是的...具有某些資格。
線程安全實際上意味着代碼在多線程應用程序中根據其指定的行為工作。 問題在於您並沒有清楚地說明您期望代碼實際做什么 。
我們可以說的是:
synchronized
。這對於String
值不重要,因為它們是不可變的。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.