【问题标题】:ConcurrentNavigableMap, interpretation of weakly consistent iteratorsConcurrentNavigableMap,弱一致迭代器的解释
【发布时间】:2011-11-06 03:43:41
【问题描述】:

在JavaDoc for ConcurrentNavigableMap,我对以下内容有点困惑:

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

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

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

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

【问题讨论】:

    标签: java iterator concurrenthashmap concurrent-collections


    【解决方案1】:

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

    ConcurrentHashMap 和 ConcurrentSkipListMap 的作者,Doug Lea,appears to agree,保证根本不是保证,并且在 ConcurrentHashMap 的情况下,迭代器可以报告映射处于它之前的状态绝不 真的进去了。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我想我基本上想知道是否在 ConcurrentNavigableMaps 上创建迭代器,如 ConcurrentSkipListMap,创建地图的“快照”视图。我会更新我的问题。文档的第一部分似乎暗示它将代表一个快照,但第二部分似乎与它相矛盾。我也对任何指向其他文档或源代码的链接感兴趣,以支持任何一种解释。我已经在 ConcurrentSkipListMap 的源代码中四处寻找,但到目前为止,这似乎并不重要,我想我会提出这个问题。
      • ConcurrentSkipListMap 的 Javadoc 明确声明它生成弱一致的迭代器而不是快照。据我所知,JRE 中唯一一个迭代器具有快照语义的并发集合是CopyOnWriteArrayList。
      • 是的。我猜是一厢情愿的想法。即使是迭代器中的一些适度的一致性,也会对我的项目有所帮助,但我现在必须找到另一种方法。谢谢axtavt,我会支持帮助。我找到了更多关于实际保证的信息,我将在下面发布。
      猜你喜欢
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2017-04-01
      • 2017-09-03
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多