什么是快速失败(fail-fast)
快速失败(fail-fast)是Java集合的一种错误检测机制。
在使用迭代器对集合进行遍历的时候,我们在多线程下操作非安全失败(fail-safe)的集合类可能就会触发fail-fast机制,导致抛出ConcurrentModificationException异常。
在单线程下,如果在便利的时候对集合对象的内容进行了修改情况下也会触发fail-fast机制。
为什么呢?
每当迭代器使用 hashNext()/next() 遍历下一个元素之前,都会检测 modCount 变量是否为 expectedModCount 值,是的话就返回遍历;否则抛出异常,终止遍历。
如果我们在集合遍历期间对其进行修改的话,就会改变 modCount 值,导致 modCount != expectedCount ,抛出ConcurrentModificationException异常。
注:通过 Iterator 的方法修改集合的话回去重新赋值 modCount = expectedCount ,不会抛异常。
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
所以阿里巴巴开发规范手册里有相关规定:
什么是安全失败(fail-safe)
先复制原有集合内容,在copy的集合上进行遍历。所以在遍历过程中队员集合所作的修改并不能被迭代器检测到,故不会抛出异常。