故障安全迭代器和弱一致性迭代器

21

容错迭代器是那些不会抛出 ConcurrentModificationException 异常的迭代器。

但是,fail safe 迭代器weakly consistent 迭代器 有什么区别呢?

它们是相同的吗?


https://dev59.com/eGYq5IYBdhLWcg3w7E6w - Vlad
1
https://dev59.com/eGYq5IYBdhLWcg3w7E6w - user2860053
1个回答

26

无论是Fail-safe 还是Weakly consistent 遍历器都不会抛出ConcurrentModificationException异常。

弱一致性遍历器(Weakly consistent iterators):依赖CAS(比较与交换)算法的集合具有弱一致性遍历器,它们可以反映自创建以来支撑它们的集合所进行的某些更改情况,但不一定全部。例如,如果在遍历器到达元素之前已修改或删除了集合中的元素,则肯定会反映这些更改,但对于插入操作则没有此类保证。

安全失败遍历器(Fail safe iterator)机制会复制内部的Collection数据结构并使用它来迭代元素。这将防止在基础数据结构更改时引发任何并发修改异常。当然,这也带来了复制整个数组的开销。

CopyOnWriteArrayList是一个具有安全失败遍历器的实现,我们可以通过查看其构造函数源代码轻松地找到它:

public CopyOnWriteArrayList(Collection<? extends E> c) {
        Object[] elements = c.toArray();

        if (elements.getClass() != Object[].class)
            elements = Arrays.copyOf(elements, elements.length, Object[].class);
        setArray(elements);
    }

参考资料:

  1. Java 泛型和集合: 11.5. 集合与线程安全
  2. 迭代器 - 快速失败 vs 安全失败

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接