簡體   English   中英

ConcurrentHashMap線程的values()安全嗎?

[英]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); } 

是的...具有某些資格。

線程安全實際上意味着代碼在多線程應用程序中根據其指定的行為工作。 問題在於您並沒有清楚地說明您期望代碼實際做什么

我們可以說的是:

  1. 迭代將看到與前述保證相同的值。
  2. 內存模型保證意味着過時的值不應有任何令人討厭的行為……除非您將值對象放入地圖后對其進行變異。 (如果這樣做,則需要實現該對象的方法來解決該問題;例如,可能需要對其進行synchronized 。這對於String值不重要,因為它們是不可變的。)

暫無
暫無

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

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