[英]Adding and removing values from ConcurrentHashMap while iterating over it
我有以下代碼:
private ConcurrentMap<String, Integer> myMap = new ConcurrentHashMap<>();
@Scheduled(fixedDelay = 600_000)
public void foo(){
myMap.values().stream().
filter(predicate()).
forEach(this::remove);
}
public void insert(String str, Integer value){
myMap.put(str, value);
}
如果在遍歷此地圖時-有人將在其中放置新值或從中刪除現有值會發生什么?
ConcurrentHashMap
的文檔包含有關行為的一些詳細信息。 首先,我們看一下ConcurrentHashMap.values()
作用:
返回此映射中包含的值的
Collection
視圖。視圖的迭代器和拆分器是弱一致的 。
該視圖的
spliterator
報告Spliterator.CONCURRENT
和Spliterator.NONNULL
。
有趣的是術語“弱一致性”和Spliterator.CONCURRENT
,其中前者描述為:
大多數並發的Collection實現(包括大多數Queue)也與通常的
java.util
約定不同,它們的迭代器和拆分器提供了弱一致性而不是快速失敗遍歷:
- 他們可能會與其他操作同時進行
- 他們永遠不會拋出
ConcurrentModificationException
- 它們被保證可以遍歷在構造時已經存在的元素一次,並且可以(但不保證)反映出構造后的任何修改。
表示元素源可以由多個線程安全地並行修改(允許添加,替換和/或刪除)的特征值,而無需外部同步。 如果是這樣,則期望拆分器具有關於遍歷期間修改的影響的文檔化策略。
從所有這些文檔中,並且與ConcurrentHashMap
的並發模型一致,這意味着流管道是完全線程安全的,並且將遍歷創建迭代器時存在的元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.