当前位置:网站首页>Fail-Fast & Fail-Safe
Fail-Fast & Fail-Safe
2022-07-15 15:23:00 【青冬】
Fail-Fast & Fail-Safe
序
since:2019年8月24日 22:19
auth: Hadi
快速失败 fail-fast
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。比如HashMap Collection
原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
在进行迭代的时候保留为expectedmodCount。
注意:这里异常的抛出条件是检测到 modCount!= expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。
场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。
安全失败 fail-safe
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。可以看到ConcurrentHashMap是通过一个EntrySetView来copy了一份数据,在iterator的时候在此基础上进行迭代。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,
所以不会触发Concurrent Modification Exception。
缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
(1)需要复制集合,产生大量的无效对象,开销大
(2)无法保证读取的数据是目前原始数据结构中的数据。
场景:java.util.concurrent 包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
后记
在Java代码开发过程中,需要时刻注意多线程引起的故障操作。
在java.util 和java.util.concurrent 包下的处理方式,也就标识着他们所能cover住的场景。
边栏推荐
- 实现两个元素并排显示 (含flex一些属性的讲解)
- 电商平台后台管理系统--->系统详细设计(用户管理模块)
- uni-app请求获取数据
- 【科科过信管】信管论文写作要求-摘要
- Niuke 2021 summer training 1-a-alice and Bob
- sqli-labs less-1(报错注入之updatexml)
- Uni app form data does not reappear
- The distant savior obeys the objective law (I) -- what can be done to Wangmiao village
- The 15th day of zero basic Lua --- finally, I'll summarize it
- Dynamic programming | 0-1 knapsack problem
猜你喜欢

Redis02: install redis in Linux Environment

三、索引优化

(pc+wap) Zhimeng template waterproof building materials website

小白挑战学c语言第一天----运行环境的搭建

MATLAB初次学习

E-commerce platform background management system --- > system detailed design (order management module)

Niuke 2021 summer training 3-b-black and white

40 + times improvement, explain in detail how to optimize the performance of juicefs metadata backup and recovery

Huawei cloud stack opens its framework to the south to help ecological partners enter the cloud efficiently

ASTM e595-15 (2021) outgassing latest standard for degassing test
随机推荐
实现两个元素并排显示 (含flex一些属性的讲解)
C leetcode question brushing notes 2- children with the most candy
12306 ticket grabbing tools shock and attack
Kekeguo information management] information management paper writing requirements - unqualified papers
image 标签 中的 mode=“widthFix“ 属性
Niuke 2021 summer training 3-b-black and white
牛客2021暑期训练3-B-Black and white
《遥远的救世主》遵守客观规律(一)——对王庙村能做什么分析
信息系统项目管理师考前10天极限冲刺+答案(七)
Chess all in one
How to create threads
抢先体验! 在浏览器里写 Flutter 是一种什么体验?
信息系统项目管理师核心考点(七)软件架构风格
信息系统项目管理师必背核心考点(一)国家信息化体系六要素
微信小程序从入门到学会第九天———-小程序的系统操作
信息系统项目管理师核心考点(八)软件集成技术
对接企业微信,客户关系管理也可以很简单!
创建线程的方式
uni-app 表单提交按钮发送请求
“认养一头牛”IPO的三只拦路虎