Java笔记-快速失败and安全失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java笔记-快速失败and安全失败相关的知识,希望对你有一定的参考价值。

参考资料:http://blog.csdn.net/chenssy/article/details/38151189

 

快速失败 fail-fast 安全失败 fail-safe
java.util包下面的所有的集合类都是快速失败的 java.util.concurrent包下面的所有的类都是安全失败的
快速失败的迭代器会抛出ConcurrentModificationException异常 安全失败的迭代器不会抛出ConcurrentModificationException异常。

 

 

快速失败

是指某个线程在迭代vector的时候,不允许其他线程修改该vector的内容,这样迭代器迭代出来的结果就会不准确,如用iterator迭代collection的时候,iterator就是另外起的一个线程,它去迭代collection,如果此时用collection.remove(obj)这个方法修改了collection里面的内容的时候,就会出现ConcurrentModificationException异常,这时候该迭代器就快速失败。

比如HashMap HashSet ArrayList都是快速失败的 

为什么叫快速? 我的理解:在迭代的时候,如果另一个线程修改了里面的内容,就立刻报错,而不是继续迭代。

安全失败

Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。

例如:CopyOnWriterArrayList

ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。 该类产生的开销比较大,但是在两种情况下,它非常适合使用。
1:在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时。
2:当遍历操作的数量大大超过可变操作的数量时。

 

 

 

以上是关于Java笔记-快速失败and安全失败的主要内容,如果未能解决你的问题,请参考以下文章

Java的快速失败和安全失败

SSM 快速搭建笔记

Java 快速失败( fail-fast ) 安全失败( fail-safe )

Effective java 第十章 并发 避免过度同步 读书笔记

Java中快速失败(fail-fast)和安全失败(fail-safe)的区别?

面试题思考:java中快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?