如何解决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
实现的,其迭代器是通过跟踪接下来应该遍历哪个跳过列表节点来实现的。这自然为您提供了“弱一致性”属性:如果删除了下一项,则迭代器仍将返回它。如果删除下一个项目,则迭代器将反映这些更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。