一:快速失败(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)的区别是什么?相关推荐

  1. Java - Java集合中的快速失败Fail Fast 机制

    文章目录 什么是 fail-fast 源码解读 Itr 为什么对集合的结构进行修改会发生并发修改异常-源码分析 修改方法之 remove 修改方法之 add 案例分享 [案例一] [案例二] [案例三 ...

  2. 解决支付宝验证失败sign check fail: check Sign and Data Fail

    成功解决支付宝验证失败sign check fail: check Sign and Data Fail 解决方法: 在使用支付宝的沙漏环境开发测试支付功能的时候,报上面错误. 问题出现在一个参数上: ...

  3. 什么是Fail Fast和Fail Safe?

    这里是目录标题 1. Fail Fast a. 概念 b. 原理 c. 关注点 d. 注意 2. Fail Safe a. 概念 b. 原理 3. Fail Fast 和 Fail Safe的区别 1 ...

  4. 聊聊hikari与tomcat jdbc pool的fail fast

    序 本文主要研究在中途数据库挂的情况下,hikari与tomcat jdbc pool的fail fast情况. 实验代码 @Testpublic void testDatabaseDownAndUp ...

  5. 【转载】ArrayList 中数据删除 fail fast

    2019独角兽企业重金招聘Python工程师标准>>> 本文转载自http://shift-alt-ctrl.iteye.com/blog/1839147 在循环arrayLlist ...

  6. 【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 ...

  7. Fail Fast与Fail Safe的区别

    Fail Fast Fail Fast Iterator在遍历集合时,若该集合发生了结构性的改变,则将抛出 ConcurrentModification 异常.例如: Map<String, S ...

  8. linux成功和失败的英文,成功与失败英文作文

    学会失败.成功没有捷径,历史上有成就的人,总是敢于行动,也会经常失败,不要让对失败的恐惧,绊住你尝试新事物的脚步.以下是学习啦小编分享给大家的关于成功与失败英文作文,欢迎大家前来参考! 成功与失败英文 ...

  9. ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...

    ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...

  10. sign check fail: check Sign and Data Fail

    支付宝开发报错:com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail 解决方法: 确认使用的支付宝公 ...

最新文章

  1. Virtual 2004中安装DOS以及实现文件共享的方法
  2. Vs2005+VSS 2005 老是出问题
  3. 深度洞见|从起源到应用,一文详解营销界爆火的 CDP
  4. Cloud for Customer Mashup debug in IFrame
  5. 【渝粤教育】国家开放大学2018年春季 0579-22T电路及磁路(2)(一) 参考试题
  6. CSS Grid网格布局全攻略
  7. cad动态块制作翻转_装X必学,手把手教你做CAD动态属性块
  8. php system startup,opencart Warning: require_once(/system/startup.php) failed to open stream
  9. 小熊派:用OpenHarmory3.0点亮LED
  10. 基于Token的身份验证——JWT
  11. 生活在继续,梦,也要继续
  12. java8接口写静态方法_Java 8接口更改–静态方法,默认方法
  13. non-local Means(非局部均值)降噪算法及快速算法原理与实现
  14. 用微信公众号做淘宝优惠券查券搜券和返利机器人的详细配置教程
  15. 惠斯通电桥电路 轴扭矩 计算
  16. maven 打包指定依赖包_maven 打包包含依赖
  17. android studio中光线传感器解析
  18. 中科易朔CASfire 分析中心
  19. 切换NPM源(淘宝源)
  20. 分组 (group)

热门文章

  1. SharePoint 2010多语言包的安装
  2. 带头结点的单链表删除
  3. Struts2中Result类型介绍
  4. STL(六)——max_element和min_element
  5. 详解fianl,finally,finalize关键字
  6. leetcode mysql 排名_GitHub - nimphy/leetcode-Mysql
  7. 超详细动手搭建一个 VuePress 站点及开启 PWA 与自动部署
  8. Django编写RESTful API(二):请求和响应
  9. 无线传感器网络 | 名词解释
  10. JavaWeb——Get、Post请求中文乱码问题