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

本文深入探讨了Java中快速失败(fail-fast)和安全失败(fail-safe)机制的区别,包括同步修改的概念,快速失败的原理及不安全性,以及安全失败如何通过复制原有集合内容来避免异常。详细解释了这两种机制在Java.util和Java.util.concurrent包下的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源: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包下的集合类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值