繁体   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