java—在concurrenthashmap上迭代时添加和删除值

rn0zuynd  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(729)

我有这个密码:

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上迭代时,有人会在其中放入一个新值或从中删除一个现有值,会发生什么情况?

6mw9ycah

6mw9ycah1#

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

相关问题