簡體   English   中英

ConcurrentHashMap的集合在foreach中是否是線程安全的?

[英]Does Set of ConcurrentHashMap is thread safe in foreach?

在下一組中執行foreach,添加,刪除,調整不同線程中的操作是否安全?

private final Set<MyObject>  myConcurrentHashSet = ConcurrentHashMap.newKeySet();

即我不需要在foreach或size操作中獲得最大的准確性,但我需要確保在進行foreach / add / remove / size操作時不會有任何異常。

我知道ConcurrentHashMap是線程安全的,但我對它的Set的線程安全感到困惑。

是的,keySet視圖是線程安全的,java> = 8中的newKeySet相當於這個java 7形式:

for java <= 7

ConcurrentHashMap c = ...;
Set threadSafeSet = c.keySet();

對於java> = 8

Set threadSafeSet =  ConcurrentHashMap.newKeySet();

來自ConcurrentHashMap文檔:

檢索操作(包括get)通常不會阻塞,因此可能與更新操作(包括put和remove)重疊。 檢索反映了最近完成的更新操作的結果。 (更正式地說,給定密鑰的更新操作承擔與該密鑰報告更新值的任何(非空)檢索之前發生的關系。)

類似地,Iterators,Spliterators和Enumerations在迭代器/枚舉的創建時或之后的某個時刻返回反映哈希表狀態的元素。 它們不會拋出ConcurrentModificationException。 但是,迭代器設計為一次只能由一個線程使用。

暫無
暫無

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

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