快速失败与安全失败

什么是快速失败?

当你创建List集合或HashMap等集合时使用迭代器iterator进行迭代,再进行增加,删除的操作时就会抛出ConcurrentModificationException异常
在这里插入图片描述
在这里插入图片描述
为什么会报错呢,原因时你迭代的是旧数据,而你进行增删操作就是改变数据,在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包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

总结

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值