java—concurrentskiplistset如何拥有弱一致的迭代器?理解“弱一致性”的含义

xriantvc  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(446)

fail fast迭代器对集合进行迭代。如果集合在迭代时被修改,我们会得到异常。相反的情况适用于fail-safe,迭代发生在一个集合上,而写操作发生在它的副本上,因此这就是fail-safe的工作方式(例如copyonwritearaylist)。
有人能解释一下concurrentskiplistset是如何实现故障安全的吗?修改集合时没有副本(就像copyonwrite类那样),那么它是如何发生的呢?我阅读是因为它的迭代器是弱一致的。我看了文件,还是不懂(但我知道在并发关系之前代码可见性或发生了什么)。
有没有人有逻辑和容易记住的解释,因为我是一个初学者?
//示例:

ConcurrentSkipListSet<Integer> set = new ConcurrentSkipListSet<>();
      set.add(1);
      set.add(2);
      set.add(3);
      set.add(4);

      Iterator<Integer> iterator = set.iterator();
      while (iterator.hasNext()){
          System.out.println(iterator.next());
          set.remove(4);
      }

OUTPUT:
1
2
3

我期待concurrentexception在这里抛出。。请帮助:(

j8ag8udp

j8ag8udp1#

“弱一致性”术语在java.util.concurrent包描述中定义:
大多数并发集合实现(包括大多数队列)也不同于通常的java.util约定,因为它们的迭代器和拆分器提供弱一致性而不是快速失败遍历:
可与其他作业同时进行
他们永远不会扔 ConcurrentModificationException 它们保证只穿过一次施工时存在的构件,并且可能(但不保证)反映施工后的任何修改。
在这种情况下 ConcurrentSkipListSet ,迭代器没有“fast fail”属性,而是反映了 4 已从片场中移除。
在内部, ConcurrentSkipListSet 使用实现 ConcurrentSkipListMap 它的迭代器是通过跟踪下一步应该遍历哪个跳过列表节点来实现的。这自然会为您提供“弱一致性”属性:如果下一项被删除,迭代器仍将返回它。如果删除了下一个之外的项,迭代器将反映这些更改。

相关问题