fail-fast 快速失败机制,其实就是当 你在使用增强for循环去遍历某些集合的同时去对他们进行增删操作,而这种操作是有缺陷的,可能引起出现bug,那么系统便觉得没用必要再继续执行下去了,便抛出ConcurrentModificationException异常,进行快速失败。
具体原因是 在使用增强for的时候,底层实际上是使用 迭代器进行循环的。
当我们在使用迭代器的next()方法去获取元素时 ,它会调用checkForComodification()方法
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
expectedModCount 是iterator中的一个成员变量,而iterator是ArrayList的一个内部类,当ArrayList调用iterator()方法获取一个迭代器时,会创建一个iterator,并且将expectedModCount 初始化为modCount的值。只有该迭代器修改了集合,expectedModCount 才会修改。
那么当去对集合进行增删操作时,会将 modcount的值++,就会触发checkForComodification()方法中的if判断,抛出异常。
那么如何避免这种情况呢?
1. 我们可以使用普通for循环去遍历集合,但是这种操作可能会跳过某些元素,因为当前面的元素被移除出集合中后,后面的元素会向前移动,导致跳过元素。
2. 那么解决元素向前移动的问题即可,因此我们可以用for循环倒序遍历集合就不会出现元素移动的现象了。
3. 还可以调用迭代器本身的remove方法去操作元素,因为迭代器的remove方法也会改变expectedmodCount的值,那么也不会触发fail-fast
4. 然后使用copyonwrite 集合,copyonwrite 在进行增删操作的时候会复制的数组中添加或删除元素,进行了读写分离,不会对集合本身的origin array造成影响,因此当然也不会有fail-fast了。