我有这个密码:
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);
}
如果在这个Map上迭代时,有人会在其中放入一个新值或从中删除一个现有值,会发生什么情况?
1条答案
按热度按时间6mw9ycah1#
的文档
ConcurrentHashMap
有一些关于行为的细节。首先我们看看什么ConcurrentHashMap.values()
做:返回一个
Collection
此Map中包含的值的视图。。。视图的迭代器和拆分器是弱一致的。
景色很美
spliterator
报告Spliterator.CONCURRENT
以及Spliterator.NONNULL
.有趣的是术语“弱一致”和
Spliterator.CONCURRENT
,其中前者描述为:大多数并发集合实现(包括大多数队列)也与通常的不同
java.util
迭代器和拆分器提供弱一致性而不是快速失败遍历的约定:可与其他作业同时进行
他们永远不会扔
ConcurrentModificationException
它们保证只穿过一次施工时存在的构件,并且可能(但不保证)反映施工后的任何修改。以及
Spliterator.CONCURRENT
描述如下:特征值,表示可以由多个线程安全地同时修改元素源(允许添加、替换和/或删除),而无需外部同步。如果是这样,那么spliterator应该有一个关于遍历期间修改的影响的文档化策略。
从所有这些文档中,并与
ConcurrentHashMap
,这意味着流管道是完全线程安全的,在创建迭代器时将遍历元素。