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