簡體   English   中英

在ConcurrentHashMap上進行迭代時添加和刪除值

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

有趣的是術語“弱一致性”Spliterator.CONCURRENT ,其中前者描述為:

大多數並發的Collection實現(包括大多數Queue)也與通常的java.util約定不同,它們的迭代器和拆分器提供了弱一致性而不是快速失敗遍歷:

  • 他們可能會與其他操作同時進行
  • 他們永遠不會拋出ConcurrentModificationException
  • 它們被保證可以遍歷在構造時已經存在的元素一次,並且可以(但不保證)反映出構造后的任何修改。

Spliterator.CONCURRENT描述為:

表示元素源可以由多個線程安全地並行修改(允許添加,替換和/或刪除)的特征值,而無需外部同步。 如果是這樣,則期望拆分器具有關於遍歷期間修改的影響的文檔化策略。

從所有這些文檔中,並且與ConcurrentHashMap的並發模型一致,這意味着流管道是完全線程安全的,並且將遍歷創建迭代器時存在的元素。

暫無
暫無

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

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