3

ConcurrentNavigableMap 的 JavaDoc 中,我对以下内容有些困惑:

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

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

这是什么意思,这似乎是一个矛盾 - 要么它可以保证遍历元素,因为它们存在于构造中,或者它可能反映构造后的修改?

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

4

2 回答 2

4

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

ConcurrentHashMap 和 ConcurrentSkipListMap 的作者 Doug Lea似乎同意保证根本不是保证,并且在 ConcurrentHashMap 的情况下,迭代器可以报告映射处于从未实际处于的状态.

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

ConcurrentSkipListMap 中的迭代器迭代跳过列表中的常规节点,这些节点使用易失性引用链接。可能这种有点令人困惑的 JavaDoc 语句实际上 [简单地] 指的是发生前的保证。即其他线程在创建迭代器之前所做的更改对于驱动迭代的线程将是可见的。

于 2011-11-08T02:13:18.657 回答
2

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

在实践中,这意味着(大致)当弱一致性迭代器遍历集合时,它不能反映已经遍历的集合部分的变化,但会反映尚未遍历的集合部分的变化。

于 2011-11-06T10:42:14.997 回答