Java ConcurrentNavigableMap,弱一致迭代器的解释

Java ConcurrentNavigableMap,弱一致迭代器的解释,java,iterator,concurrenthashmap,concurrent-collections,Java,Iterator,Concurrenthashmap,Concurrent Collections,在报告中,我对以下几点感到困惑: 视图的迭代器是一个“弱一致性”迭代器,它永远不会 抛出ConcurrentModificationException,并保证遍历 元素在构造迭代器时存在,并且可能 (但不保证)反映本协议之后的任何修改 建筑 在ConcurrentSkipListMap等接口的实现中,措辞似乎是相同的 这意味着什么,这似乎是一个矛盾-要么它可以保证在构建时遍历元素,要么它可能反映构建后的修改 更新:我基本上想知道在ConcurrentNavigableMap(如Concurren

在报告中,我对以下几点感到困惑:

视图的迭代器是一个“弱一致性”迭代器,它永远不会 抛出ConcurrentModificationException,并保证遍历 元素在构造迭代器时存在,并且可能 (但不保证)反映本协议之后的任何修改 建筑

在ConcurrentSkipListMap等接口的实现中,措辞似乎是相同的

这意味着什么,这似乎是一个矛盾-要么它可以保证在构建时遍历元素,要么它可能反映构建后的修改


更新:我基本上想知道在ConcurrentNavigableMap(如ConcurrentSkipListMap)上创建迭代器是否会创建地图的“快照”视图。

措辞很奇怪,但实际上这意味着迭代器可能会反映构造迭代器后所做的一些更改,但不能保证反映所有更改。除了这些反映出来的变化,元素在构建时就已经被遍历了


实际上,这意味着(大致上)当弱一致迭代器遍历集合时,它不能反映已遍历的集合部分中的更改,而是反映尚未遍历的集合部分中的更改。

回答我自己的问题,讨论了迭代器在并发兴趣邮件列表上提供的一致性保证的强度

ConcurrentHashMap和ConcurrentSkipListMap的作者Doug Lea表示,保证根本不是什么保证,在ConcurrentHashMap的情况下,迭代器可以报告映射处于从未处于的状态 实际上是在

对于那些好奇的人来说,ConcurrentSkipListMap的源代码,特别是它的内部Iter(迭代器)类是


ConcurrentSkipListMap中的迭代器迭代跳过列表中的常规节点,这些节点使用volatile引用链接。可能这种情况下,这个有点混乱的JavaDoc语句实际上[简单地]指的是一个before保证。i、 e.其他线程在创建迭代器之前所做的更改对于驱动迭代的线程来说是可见的。

我想我基本上想知道在ConcurrentNavigableMap(如ConcurrentSkipListMap)上创建迭代器是否会创建映射的“快照”视图。我会更新我的问题。文档的第一部分似乎暗示它将代表一个快照,但第二部分似乎与之矛盾。我还对支持这两种解释的其他文档或源代码的链接感兴趣。我已经翻遍了ConcurrentSkipListMap的源代码,但到目前为止,它似乎并不琐碎,我认为我应该回答这个问题。ConcurrentSkipListMap的Javadoc明确指出,它生成一个弱一致的迭代器,而不是快照。据我所知,JRE中迭代器具有快照语义的唯一并发集合是
CopyOnWriteArrayList
.Yep。我想是一厢情愿吧。即使是迭代器中的一些适度一致性,也会对我的项目有所帮助,但我现在必须找到另一种方法。谢谢axtavt,我会投赞成票的。我发现了更多关于实际担保的信息,我将在下面发布。