Java笔记-快速失败and安全失败
2016-09-12 19:51
337 查看
参考资料:http://blog.csdn.net/chenssy/article/details/38151189
快速失败
是指某个线程在迭代vector的时候,不允许其他线程修改该vector的内容,这样迭代器迭代出来的结果就会不准确,如用iterator迭代collection的时候,iterator就是另外起的一个线程,它去迭代collection,如果此时用collection.remove(obj)这个方法修改了collection里面的内容的时候,就会出现ConcurrentModificationException异常,这时候该迭代器就快速失败。
比如HashMap HashSet ArrayList都是快速失败的
为什么叫快速? 我的理解:在迭代的时候,如果另一个线程修改了里面的内容,就立刻报错,而不是继续迭代。
安全失败
Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。
例如:CopyOnWriterArrayList
ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。 该类产生的开销比较大,但是在两种情况下,它非常适合使用。
1:在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时。
2:当遍历操作的数量大大超过可变操作的数量时。
快速失败 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:当遍历操作的数量大大超过可变操作的数量时。
相关文章推荐
- 170118、快速失败Vs安全失败(Java迭代器附示例)
- java中的快速失败(fail-fast)与安全失败(fail-safe)
- Java的快速失败和安全失败
- Java学习笔记 14 快速失败fail-fast机制
- Java集合的快速失败和安全失败
- Java基础之——快速失败&安全失败(最全的总结)
- java中的快速失败(fail-fast)与安全失败(fail-safe)
- java快速失败和安全失败
- java的快速失败模式和安全失败模式
- 【Java源码分析】ConcurrentModificationException并发修改异常分析与解决方案(快速失败与安全失败)
- 快速失败Vs安全失败(Java迭代器附示例)
- Java快速失败和安全失败
- Java的快速失败和安全失败
- 【笔记】Eclipse and Java for Total Beginners—007
- Guava学习笔记(1)--安全地使用null(Using and avoiding null)
- Java keytool 安全证书学习笔记
- Java 学习笔记16:用ThreadLocal解决多线程安全问题
- java 安全 笔记
- java虚拟机学习笔记——java安全模型
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁