ConcurrentSkipListSet如何具有弱一致的迭代器?了解“弱一致性”的含义

问题描述

故障快速迭代器遍历集合。如果集合在迭代时被修改,我们将获得异常。相反,该方法适用于故障保护,其中迭代发生在一个集合上,而写操作发生在它的副本上,因此这是故障保护的工作方式(例如,copyOnWriteArrayList)。

有人可以解释一下ConcurrentSkipListSet如何具有故障保护功能吗?修改集合时没有副本(如copyOnWrite类一样),那么它是如何发生的呢?我读这本书是因为它的Iterator弱一致性。我读了文档,但我还是不明白。 (但我确实知道什么是代码可见性或并发关系之前发生的事情)。

作为我的初学者,有人有逻辑并且容易记住的解释吗?

//示例:

 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。请帮助:(

解决方法

“弱一致性”一词在java.util.concurrent package description中定义:

大多数并发Collection实现(包括大多数Queue) 也与通常的java.util约定不同之处在于 迭代器和拆分器提供弱一致性而不是 快速失败遍历:

  • 它们可以与其他操作同时进行
  • 他们永远不会抛出ConcurrentModificationException
  • 保证它们遍历原先存在的元素一次,并且可能(但不保证)反映 施工后进行的任何修改。

在这种情况下,对于ConcurrentSkipListSet,迭代器没有“ fast-fail”属性,而是反映了对4的修改已从集合中删除。

在内部,ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的,其迭代器是通过跟踪接下来应该遍历哪个跳过列表节点来实现的。这自然为您提供了“弱一致性”属性:如果删除了下一项,则迭代器仍将返回它。如果删除下一个项目,则迭代器将反映这些更改。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...