快速失败、安全失败都是基于迭代器。
一、fail-fast
抛出ConcurrentModificationException异常。
单线程环境:使用迭代器遍历一个集合的过程中,修改了它的结构(增、删、扩容、排序、trim)。使用iterator的remove()方法不会报这个错。
多线程环境:当一个线程使用迭代器遍历这个集合,另一个线程修改了这个集合的结构。
fail-fast机制是如何起检测的:迭代器内部维护了一个结构变动标记expectedModCount,在遍历过程中,每次next()方法都会检测和modCount对比是否有变动。
二、fail-safe
CopyOnWriteArrayList,对集合的修改在一个复制的集合上面操作。
fail-safe机制有两个问题
(1)需要复制集合,产生大量的无效对象,开销大
(2)无法保证读取的数据是目前原始数据结构中的数据。