fail-fast和fail-safe的区别

简介:
fail-fast(快速失败)是Java对java.util包下的所有集合类的是一种错误检测机制。
fail-safe(安全失败)采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

区别:
java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。fail-fast(快速失败)的迭代器会抛出ConcurrentModificationException异常,而因为安全失败是基于对底层集合做拷贝,所以,它不受源集合上修改的影响,安全失败的迭代器永远不会抛出这样的异常。

fail-fast 机制:

在遍历一个集合时,当集合结构被修改,会抛出ConcurrentModificationException。

fail-fast会在以下两种情况下抛出ConcurrentModificationException

    a、单线程环境:集合被创建后,在遍历它的过程中修改了结构。

    b、多线程环境:当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改

目的:保护数据。

产生原因:fail-fast 产生的原因

如何解决:
        a、并发遍历集合是不要修改集合
        b、调用fail-safe类集(CopyOnWriteArrayList,ConcurrentHashMap)

fail-safe机制:

任何对集合结构的修改都在一个复制的集合上进行修改,所以不会抛出异常,因为原来的集合根本就没变

实现机制:fail-safe 的实现机制

缺点:
        a、 需要复制集合,产生大量无效对象,开销大。
        b、无法保证读取的数据是目前原始数据结构中的数据。

猜你喜欢

转载自blog.csdn.net/weixin_41891854/article/details/81781893
今日推荐