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