快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
一:快速失败(fail—fast)
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。
场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。
二:安全失败(fail—safe)
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。
缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?相关推荐
- Java - Java集合中的快速失败Fail Fast 机制
文章目录 什么是 fail-fast 源码解读 Itr 为什么对集合的结构进行修改会发生并发修改异常-源码分析 修改方法之 remove 修改方法之 add 案例分享 [案例一] [案例二] [案例三 ...
- 解决支付宝验证失败sign check fail: check Sign and Data Fail
成功解决支付宝验证失败sign check fail: check Sign and Data Fail 解决方法: 在使用支付宝的沙漏环境开发测试支付功能的时候,报上面错误. 问题出现在一个参数上: ...
- 什么是Fail Fast和Fail Safe?
这里是目录标题 1. Fail Fast a. 概念 b. 原理 c. 关注点 d. 注意 2. Fail Safe a. 概念 b. 原理 3. Fail Fast 和 Fail Safe的区别 1 ...
- 聊聊hikari与tomcat jdbc pool的fail fast
序 本文主要研究在中途数据库挂的情况下,hikari与tomcat jdbc pool的fail fast情况. 实验代码 @Testpublic void testDatabaseDownAndUp ...
- 【转载】ArrayList 中数据删除 fail fast
2019独角兽企业重金招聘Python工程师标准>>> 本文转载自http://shift-alt-ctrl.iteye.com/blog/1839147 在循环arrayLlist ...
- 【springcloud问题】Could not locate PropertySource and the fail fast property is set, failing
问题描述:使用springcloud的本地配置中心时出现:Could not locate PropertySource and the fail fast property is set, fail ...
- Fail Fast与Fail Safe的区别
Fail Fast Fail Fast Iterator在遍历集合时,若该集合发生了结构性的改变,则将抛出 ConcurrentModification 异常.例如: Map<String, S ...
- linux成功和失败的英文,成功与失败英文作文
学会失败.成功没有捷径,历史上有成就的人,总是敢于行动,也会经常失败,不要让对失败的恐惧,绊住你尝试新事物的脚步.以下是学习啦小编分享给大家的关于成功与失败英文作文,欢迎大家前来参考! 成功与失败英文 ...
- ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...
ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...
- sign check fail: check Sign and Data Fail
支付宝开发报错:com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail 解决方法: 确认使用的支付宝公 ...
最新文章
- Virtual 2004中安装DOS以及实现文件共享的方法
- Vs2005+VSS 2005 老是出问题
- 深度洞见|从起源到应用,一文详解营销界爆火的 CDP
- Cloud for Customer Mashup debug in IFrame
- 【渝粤教育】国家开放大学2018年春季 0579-22T电路及磁路(2)(一) 参考试题
- CSS Grid网格布局全攻略
- cad动态块制作翻转_装X必学,手把手教你做CAD动态属性块
- php system startup,opencart Warning: require_once(/system/startup.php) failed to open stream
- 小熊派:用OpenHarmory3.0点亮LED
- 基于Token的身份验证——JWT
- 生活在继续,梦,也要继续
- java8接口写静态方法_Java 8接口更改–静态方法,默认方法
- non-local Means(非局部均值)降噪算法及快速算法原理与实现
- 用微信公众号做淘宝优惠券查券搜券和返利机器人的详细配置教程
- 惠斯通电桥电路 轴扭矩 计算
- maven 打包指定依赖包_maven 打包包含依赖
- android studio中光线传感器解析
- 中科易朔CASfire 分析中心
- 切换NPM源(淘宝源)
- 分组 (group)