fail-fast和fail-safe

fail-fast机制和fail-safe机制分别由什么作用? `fail-fast`和`fail-safe`是多线程并发操作集合时的一种失败处理机制 阅读详情

我们都接触 HashMap、ArrayList 这些集合类,这些在 java.util 包的集合类就都是快速失败的;

而  java.util.concurrent 包下的类都是安全失败,比如:ConcurrentHashMap。

 

在使用迭代器对集合对象进行遍历的时候,如果 A 线程正在对集合进行遍历,此时 B 线程对集合进行修改(增加、删除、修改),或者 A 线程在遍历过程中对集合进行修改,都会导致 A 线程抛出 ConcurrentModificationException 异常。

 

具体效果我们看下代码:

 

HashMap hashMap = new HashMap();

hashMap.put("不只Java-1", 1);

hashMap.put("不只Java-2", 2);

hashMap.put("不只Java-3", 3);

 

Set set = hashMap.entrySet();

Iterator iterator = set.iterator();

while (iterator.hasNext()) {

       System.out.println(iterator.next());

    hashMap.put("下次循环会抛异常", 4);

    System.out.println("此时 hashMap 长度为" + hashMap.size());

}

执行后的效果如下图:

 

 

为什么在用迭代器遍历时,修改集合就会抛异常时?

 

原因是迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。

 

每当迭代器使用 hashNext()/next() 遍历下一个元素之前,都会检测 modCount 变量是否为 expectedModCount 值,是的话就返回遍历;否则抛出异常,终止遍历。

 

 

安全失败(fail-safe)

 

明白了什么是快速失败之后,安全失败也是非常好理解的。

 

采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

 

由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,故不会抛 ConcurrentModificationException 异常

 

我们上代码看下是不是这样

ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap();

concurrentHashMap.put("不只Java-1", 1);

concurrentHashMap.put("不只Java-2", 2);

concurrentHashMap.put("不只Java-3", 3);

 

Set set = concurrentHashMap.entrySet();

Iterator iterator = set.iterator();

 

while (iterator.hasNext()) {

    System.out.println(iterator.next());

    concurrentHashMap.put("下次循环正常执行", 4);

}

System.out.println("程序结束");

 

 

运行效果如下,的确不会抛异常,程序正常执行。 

 

 

 

最后说明一下,快速失败和安全失败是对迭代器而言的。并发环境下建议使用 java.util.concurrent 包下的容器类,除非没有修改操作。

 

 

fail-fast 和 fail-safe 快速学习 首选说一下这两个的概念。 阅读详情

相关推荐

fail-fast 和 fail-safe 迭代器

总结起来,fail-fast 迭代器会在遍历过程中立即检测到并发修改,但可能导致异常,需要额外的异常处理。fail-fast 和 fail-safe 迭代器是两种不同的迭代器设计策略,用于在遍历集合(如 ArrayList、HashMap)时处理并发修改的情况。这种迭代器的工作原理是,它不直接在集合上执行遍历操作,而是在迭代器上创建一个副本,然后在副本上执行遍历。这种迭代器的优点是避免了并发修改引发的异常,但缺点是可能会导致遍历结果不一致,因为它不会反映实时的集合状态。,它们是设计用于高并发场景的集合类。

学无止境 818

fail-fast(快速失败)机制和fail-safe(安全失败)机制的介绍和区别

fail-fast和fail-safe的区别:  fail-safe允许在遍历的过程中对容器中的数据进行修改,而fail-fast则不允许。 fail-fast ( 快速失败 ) fail-fast:直接在容器上进行遍历,在遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常导致遍历失败。java.util包下的集合类都是快速...

striner的博客 1万+

UE5深度图与Mask图渲染实战:从基础到高级应用

本文详细解析了在UE5中渲染深度图与Mask图的完整实战流程。从启用电影渲染队列、配置自定义深度模板通道等前期准备,到构建即用型深度图材质网络与精准物体Mask生成,并深入探讨了二者结合在NPR风格化、程序化雾气及AI工作流(如ComfyUI)中的高级应用,为影视、游戏后期与AI创作提供了高效的解决方案。

weixin_29001419的博客 348

fail-safe和fail-fast详细介绍,快速失败和失败安全

fail-safe和fail-fast详细介绍,快速失败和失败安全

java架构师分享,有问题可以联系我 642

RK3566/RK3588 NPU性能实测:用mobilenet模型快速验证你的开发板NPU是否正常工作

本文提供了RK3566/RK3588开发板NPU性能实测指南,通过MobileNet模型快速验证NPU是否正常工作。详细介绍了环境搭建、测试资源获取、编译运行及结果分析的全流程,帮助开发者高效验证神经网络加速器功能,为后续AI应用部署奠定基础。

weixin_28826521的博客 447

交流电路计算方法:复阻抗和相量法

一,复阻抗 电容电路,电压与电流的大小比值是XC=1/WC,相位上电流比电压超前90度 这样描述很麻烦,在复平面里,相位超前90度,可以用什么数学表示呢? 也就是说,一个相量,乘以j之后,大小没变化,相位变得超前90度了 同样的,大小不变,相位落后90度应该除以j 原来我们说电容电路,给个电压,算电流又要算XC,又要另外说相位超前90度,现在可以简单点 在这个计算式里,1/wc还是原来的容抗大...

theory and practice的博客 3万+

Fail-Fast 和 Fail-Safe的解析

Fail-Fast集合(如ArrayList、HashMap)内部维护一个修改计数器(moudCount)该计数器用来记录集合的修改次数,迭代期间通过对比预期修改次数与实际修改次数expectedMoshdCount和modCount是否一致来判断是否存在并发操作,从而实现快速失败。Fail-Safe 是一种机制,当在遍历集合的过程中集合被修改,不会抛出异常,而是继续使用原来的集合副本进行遍历。Fail-Safe 集合(如。)在遍历时使用集合的。

LMR1314的博客 462

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 562

一文彻底弄懂fail-fast、fail-safe机制(带你撸源码)

一文彻底弄懂fail-fast、fail-safe机制(带你撸源码) 什么是fail-fast(快速失败)? fail-fast 机制是Java集合(Collection)中的一种错误机制。 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的结构进行了修改(增加、删除),则会抛出Concurrent Modification Exception(并发修改异常)。 所以,在多线程环境下,是很容易抛出Concurrent Modification Exception的,比如线程1正在对集合进行遍历,此时线

MCQ1999的博客 1600

使用下一代的嵌入式IDE-PlatformIO 教程

1.生成工程 1.1 打开STM32CubeMX: 选择你的MCU,这里我用的是STM32F103RC RCC中开启外部HSE时钟,外部时钟比HSI更稳定些 开启DEBUG 4线 打开串口1用于打印调试信息,波特率115200,校验位0,停止位1 打开串口2用于MODBUS协议,波特率9600,校验位0,停止位1 接入RT-thread:参考官方文档 基于 CubeMX 移植 RT-Thread Nano 根据官方文档,需要1.取消生成HardFault_Handler、PendSV_Handler、Sy

jiladahe1997的博客 3万+

8. Spring Ai之入门到精通(超级详细)

Spring AI 1.0.0 M1里程碑版本发布,标志着 Java 终于踏进Ai的时代半只脚。

gorgor在码农 3万+

Java中的Fail-Fast和Fail-Safe机制是什么?

Fail-Fast:快速发现并发修改问题,适用于单线程环境。实现简单,性能较高,但在多线程环境下可能抛出异常。Fail-Safe:避免因并发修改导致异常,适用于多线程环境。实现复杂,性能较低,但更适合高并发场景。根据具体的使用场景选择合适的机制,可以有效提高程序的健壮性和性能。一句话:Fail-Fast的目的是为了快速抛出错误让程序感知,而Fail-Safe的目的是程序进行容灾,避免因为异常导致程序停止。

weixin_45762066的博客 734

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2052

什么是fail fast和fail safe?

当集合在被遍历期间结构发生变化(非当前迭代器自身的 remove),则会立即抛出异常。遍历期间即使集合发生结构变化,也不会抛异常,能够容忍并发修改,但修改对当前迭代器不可见(即“弱一致性”)。特性Fail-FastFail-Safe迭代结构变化响应抛出不抛异常,允许修改线程安全❌ 否(多数为非线程安全集合)✅ 是(基于 CopyOnWrite 或 CAS)实现方式检查 modCount快照副本或弱一致性容器修改是否可见❌ 修改直接失败❌ 修改对当前迭代器不可见(快照)或延迟可见。

weixin_46072507的博客 776

科研级YOLOv8 Neck革新:BiFPN双向特征金字塔赋能,让多尺度融合更高效的实战指南

在文件夹下新建BiFPN.py,将上述BiFPNLayer和BiFPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。

m0_64661770的博客 152

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

fail safe和fail fast机制分别有什么作用

AQS(AbstractQueuedSynchronizer)是Java并发编程中的一个核心组件,用于构建锁、信号量等同步工具。它通过一个先进先出(FIFO)队列来管理线程的排队和调度,提供了一个通用的机制来实现阻塞锁和其他依赖同步的类。

u012534547的博客 843

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

集合中的 fail-fast 和 fail-safe 是什么?别再被这个经典坑住了!

在 Java 的集合框架中,fail-fast(快速失败)和fail-safe(安全失败)是描述迭代器在集合被修改时的行为机制。fail-fast:在遍历过程中,如果检测到集合被结构性修改(除迭代器自身的remove()外),会立即抛出。fail-safe:在遍历过程中,允许集合被修改,因为其基于原始集合的拷贝副本进行遍历,不会抛出异常。这两种机制与线程安全、集合类型、性能代价等都息息相关,是面试官判断你是否真正掌握集合底层设计思路的重要依据。✅机制代表集合是否抛异常底层机制fail-fast。

残影的博客 913

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

什么是fail-fast和fail-safe

fail-fast和fail-safe机制的原理及使用方法

weixin_45819295的博客 819

fail-safe 和 fail-fast

你真的了解 fail-fast 和 fail-safe 吗????? 简介 java.util 包下的 属于 fail-fast , 快速失败~ ???? java.util.concurrent 包下的 属于 fail-safe ,安全失败~ ???? 简单来说 就是 fail-fast 在迭代时,如果发现 该集合数据 结构被改变 (modCount != expectedModCount),就会 抛出 ConcurrentModificationException 小...

Tom_sensen的博客 240

fail-safe 和 fail-fast 都是什么鬼?

点击关注公众号,Java干货及时送达你真的了解 fail-fast 和 fail-safe 吗?????简介java.util 包下的 属于 fail-fast , 快速失败~...

Java技术栈,分享最主流的Java技术 456

谈谈Java集合中的fail-fast和fail-safe

摘要:Java集合框架中,迭代器处理集合修改有两种策略:fail-fast快速失败和fail-safe安全失败。fail-fast通过modCount变量检测结构性修改,发现不一致即抛出ConcurrentModificationException,如ArrayList等非线程安全集合。fail-safe则通过遍历集合副本来避免异常,如ConcurrentHashMap等并发集合,但无法获取最新修改。前者注重异常检测,后者保证遍历安全但牺牲实时性。

qq_58284486的博客 658

fail-fast 和 fail-safe 迭代器的区别是什么?

fail-fast 和 fail-safe 是两个在Java中常用的集合遍历机制的概念,主要用于描述在迭代集合时如何处理集合结构的修改。

大厂小码农的博客 695

fail-fast机制和fail-safe机制的介绍和区别

fail-fast机制并不是Java集合特有的机制,fail-fast是一种错误检测机制,一旦检测到可能发生错误,就立马抛出异常,程序不继续往下执行fail-fast和fail-safe的区别: fail-safe允许在遍历的过程中对容器中的数据进行修改,而fail-fast则不允许。

tiway的博客 1808

网易Java面试被问:fail-safe和fail-fast

Java集合框架中的Fail-Fast与Fail-Safe机制对比分析。Fail-Fast(如ArrayList)通过modCount机制在并发修改时立即抛出异常,保证数据一致性但牺牲并发性;Fail-Safe(如CopyOnWriteArrayList)通过数据副本实现安全遍历,允许并发修改但存在内存开销和弱一致性。选型时应考虑读写比例和并发需求:单线程或完全同步场景适合Fail-Fast,读多写少的高并发场景适合Fail-Safe。两种机制体现了不同的设计哲学,开发调试阶段推荐Fail-Fast快速暴露

xh2277659985的博客 1267
上一篇: Vagrant批量生成虚拟机
下一篇: 2018腾讯秋招正式笔试题目
攀子zzu
博客等级 码龄14年 5粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值