快速失败与安全失败

什么是快速失败?

当你创建List集合或HashMap等集合时使用迭代器iterator进行迭代,再进行增加,删除的操作时就会抛出ConcurrentModificationException异常
快速失败与安全失败_第1张图片
快速失败与安全失败_第2张图片
为什么会报错呢,原因时你迭代的是旧数据,而你进行增删操作就是改变数据,在iterator方法的内部中有个你旧数据的modCount,还有一个增删操作的expectedModCount,如果你增删了数据,那么count2就会+1,在iterator方法的内部有个判断if(modCount!= expectedModCount){throw new ConcurrentModificationException},java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)
为什么要搞这么个判断呢,这是为了线程安全,还可以用于检测线程并发修改的bug。

什么是安全失败?

说白了快速失败就是让你立刻失败,也就是直接报错,安全失败就是安全的失败,就是当你在迭代时对集合对象进行增删操作时不会报错,但是为什么还是失败呢,因为不能同步的线程就不能叫做成功,就算你没有报错但你迭代的还是原来的旧数据,你增删的数据还是没有同步的迭代,所以它还是失败的。
下面就让我们深入的了解一下;
为什么安全失败没有报错,他的原理是在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在copy的集合上进行遍历,遍历过程中对原集合所作的修改并不能被迭代器检测到(那个if判断),所以不会触发Concurrent Modification Exception。备份原集合的优点是避免了Concurrent Modification Exception异常,但同样地,迭代器并不能访问到修改后的内容。
那我们怎么写这个安全失败呢,其实很简单,我们只要导入java.util.concurrent
并且将原来的ArrayList集合改成CopyOnWriteArrayList集合就可以了;java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

总结

快速失败与安全失败_第3张图片
快速失败与安全失败_第4张图片

分享福利

快速失败与安全失败_第5张图片
快速失败与安全失败_第6张图片
我一般用来充会员,视频VIP;会员、vip到期时间最快一个月,价格比官方的要便宜许多,买了不亏,走运可以用个一两年,我充的第一次qq超级VIP大概用了一年多,现在还在,不说了上网址:http://member.12mx.cn/

你可能感兴趣的:(快速失败与安全失败)