Java面试33-fail-safe机制与fail-fast机制分别有什么作用
fail-safe
和fail-fast
,是多线程并发操作集合时的一种失败处理机制。
- fail-fast:表示
快速失败
,当异常产生时,直接抛出异常,程序终止。fail-fast主要是体现在当我们在遍历集合元素的时候,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构(modCount)被改变的话,就会抛出异常ConcurrentModificationException异常,防止继续遍历。常见的的使用fail-fast 方式遍历的容器有HashMap 和ArrayList 等。 - fail-safe:表示
安全失败
,采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。由于在遍历过程中对原集合所做的修改不能被迭代器检测到,所以不会触发ConcurrentModificationException。
fail-safe基于拷贝内容的优点是避免了ConcurrentModificationException,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。java.util.concurrent
包下的容器都是安全失败的,比如ConcurrentHashMap和CopyOnWriteArrayList等,可以在多线程下并发使用,并发修改。