容错迭代器是那些不会抛出 ConcurrentModificationException
异常的迭代器。
但是,fail safe 迭代器
和 weakly consistent 迭代器
有什么区别呢?
它们是相同的吗?
容错迭代器是那些不会抛出 ConcurrentModificationException
异常的迭代器。
但是,fail safe 迭代器
和 weakly consistent 迭代器
有什么区别呢?
它们是相同的吗?
无论是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);
}
参考资料:
Java 泛型和集合: 11.5. 集合与线程安全
迭代器 - 快速失败 vs 安全失败