快速失败(fail-fast)和安全失败(fail-safe)的区别是什么

题目来源:https://zhuanlan.zhihu.com/p/86536581
java面试清单
**java基础 **
快速失败(fail-fast)和安全失败(fail-safe)的区别是什么
在这里插入图片描述
什么是同步修改?
当一个或者多个线程正在遍历一个集合Collection,此时另外一个线程修改了这个集合的内容。这就是并发|同步修改。
什么是快速失败?
由修改引发的失败:在使用迭代器对集合对象进行遍历的时候,如果A线程正在进行遍历,正好B线程对集合进行了修改,那么A线程则会抛出ConcurrentModificationException
快速失败的原理:迭代器在遍历时直接访问集合中的内容,并且在遍历的时候会使用一个modCount的变量。集合在被遍历期间,若果内容发生变换,或导致modCount这个变量发生变换。因此迭代器在每一次使用hashNext()或者net()遍历下一个元素之前,都会检查这modCount的值是否是expectedmodCount值,是则继续遍历,否则抛出异常
快速失败是不安全的:因为在B线程在进行修改的过程中,能够把这个modCount值修改成expectModeCount,,使得异常无法争取的抛出
使用场景:java.util包下的集合类
什么事安全失败
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有的集合内容,在拷贝的集合上进行遍历
安全失败的原理:由于迭代是在拷贝的集合上进行遍历的,因此原集合内容的修改不回被迭代器检测到,所以不会触发异常
使用场景:java.util.concurrent包下的集合类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值