gpt4 book ai didi

java - ConcurrentSkipListSet 如何具有弱一致性的迭代器?理解 'weakly consistent' 的含义

转载 作者:行者123 更新时间:2023-12-04 09:02:21 26 4
gpt4 key购买 nike

快速失败迭代器迭代集合。如果集合在迭代时被修改,我们会得到异常。相反适用于故障安全,其中迭代发生在一个集合上,而写操作发生在它的副本上,因此这就是故障安全的工作原理(例如 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 中定义。 :

Most concurrent Collection implementations (including most Queues)also differ from the usual java.util conventions in that theirIterators and Spliterators provide weakly consistent rather thanfast-fail traversal:

  • they may proceed concurrently with other operations
  • they will never throw ConcurrentModificationException
  • they are guaranteed to traverse elements as they existed upon construction exactly once, and may (but are not guaranteed to) reflectany modifications subsequent to construction.

在这种情况下 ConcurrentSkipListSet ,迭代器没有“快速失败”属性,而是反射(reflect)了 4 的修改已从集合中删除。
内部, ConcurrentSkipListSet使用 ConcurrentSkipListMap 实现,它的迭代器是通过跟踪接下来应该遍历哪个跳过列表节点来实现的。这自然会为您提供“弱一致性”属性:如果下一项被删除,迭代器仍将返回它。如果删除了下一个之后的项目,迭代器将反射(reflect)这些更改。

关于java - ConcurrentSkipListSet 如何具有弱一致性的迭代器?理解 'weakly consistent' 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63535420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com