快速失败(fail-fast) | 安全失败(fail-safe) | |
---|---|---|
表现 | 在用迭代器遍历一个集合对象时,如果遍历过程中,对集合内容进行修改,则会抛出ConcurrentModificationException | 采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容 ,在拷贝 的集合上进行遍历 |
原理 | 迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历 | 由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发ConcurrentModificationException |
缺点 | 迭代器遍历的是开始遍历那一刻拿到的集合拷贝(旧的内容 ),在遍历期间原集合发生的修改迭代器是不知道的 |
快速失败和安全失败是对迭代器
而言的。并发环境下建议使用
java.util 包的集合类就都是快速失败的
java.util.concurrent
包下的类都是安全失败
参考:
掘金大佬是这么说的
牛客大佬上是这么说的