Java ConcurrentSkipListSet如何具有弱一致的迭代器?理解'的含义;弱一致';

Java ConcurrentSkipListSet如何具有弱一致的迭代器?理解'的含义;弱一致';,java,concurrency,iterator,concurrentskiplistmap,java-failsafe,Java,Concurrency,Iterator,Concurrentskiplistmap,Java Failsafe,Fail fast迭代器对集合进行迭代。若集合在迭代时被修改,我们将得到异常。相反适用于fail-safe,即迭代发生在一个集合上,而写操作发生在它的副本上,因此这就是fail-safe的工作方式(f.e.CopyOnWriteArrayList) 有人能解释一下ConcurrentSkipListSet是如何实现故障安全的吗?修改集合时没有副本(就像CopyOnWrite类一样),那么它是如何发生的呢?我之所以阅读,是因为它的迭代器是弱一致的。我读过文件,我还是不明白。(但我知道在并发关系出现

Fail fast迭代器对集合进行迭代。若集合在迭代时被修改,我们将得到异常。相反适用于fail-safe,即迭代发生在一个集合上,而写操作发生在它的副本上,因此这就是fail-safe的工作方式(f.e.CopyOnWriteArrayList)

有人能解释一下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
ConcurrentSkipListSet=new ConcurrentSkipListSet();
增加(1);
增加(2);
增加(3);
增加(4);
迭代器迭代器=set.Iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
设置。移除(4);
}
输出:
1.
2.
3.
我期待ConcurrentException在这里抛出。。请帮助:(

弱一致性”一词的定义如下:

大多数并发集合实现(包括大多数队列) 也不同于通常的java.util约定,它们的 迭代器和拆分器提供弱一致性,而不是 快速失败遍历:

  • 他们可以与其他行动同时进行
  • 他们永远不会抛出
    ConcurrentModificationException
  • 它们保证只在构建时遍历元素一次,并且可以(但不保证)反映 施工后的任何修改
在本例中,对于
ConcurrentSkipListSet
,迭代器没有“fast fail”属性,而是反映了已从集合中删除的对
4
的修改


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

为什么他们会发明它?他们不能像某些类那样使用快照解决此问题吗?在弱一致性迭代器中,我的迭代器可能看不到插入,因此不完整。。要获得skiplist的一致快照,您必须让所有写入操作等待快照完成。ConcurrentSkipListMap旨在利用“无锁”特性不需要等待读写操作的算法。太好了!为什么不堆栈或向量也使用它?我注意到它们失败得很快。是因为它们“旧”了,一次没有“弱一致迭代器”之类的东西吗?是的,原因是历史:“弱一致”迭代器的概念是在java 1.5中的
java.util.concurrent
包中引入的。“Fail fast”迭代器的概念是在java 1.2中的“java集合框架”中引入的。Vector和Stack甚至比这还要古老,它们的java 1.0方法,如
Vector.elements
根本不给您任何保证。它被称为“并发”,因为它为您提供了并发编程所需的内存一致性保证,如中所列。实现恰好提供了这些保证,而没有使用强制线程等待的重载锁机制。