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