1. fail-fast机制在遍历一个集合时,当集合结构被修改,很大可能会抛出Concurrent Modification Exception。fail-fast会在以下两种情况下抛出此异常:
a)单线程情况下,在遍历集合的过程中修改了结构,比如iterator的remove方法。
b)多线程情况下,当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。
之所以很大可能抛出异常是因为集合是根据集合内元素个数的变化判断是否抛出异常,比如HashMap的modCount。也许执行此判断时modCount还没有被修改,所以不一定抛出异常。所以尽量不要在产品代码中使用,可以用来debug。
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
具有fail-fast机制的主要集合有HashMap,Vector,ArrayList,HashSet。
2. fail-safe机制会把集合复制之后再进行修改,也就是说修改是在另外一个集合上进行的,因此不会抛出ConcurrentModificationException。fail-safe机制有两个结果:
a)复制集合实例,导致占用内存堆空间。
b)复制出来的集合实例无法保证与原实例完全相同。
具有fail-safe机制的主要集合有CopyOnWriteArrayList, ConcurrentHashMap。