简介

fail-fast(快速失败)是Java对java.util包下的所有集合类的是一种错误检测机制。

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

区别

java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。fail-fast(快速失败)的迭代器会抛出ConcurrentModificationException异常,而因为安全失败是基于对底层集合做拷贝,所以,它不受源集合上修改的影响,安全失败的迭代器永远不会抛出这样的异常。

fail-fast触发方式

首先是触发场景,若触发了快速失败,其场景一定是多线程同事操作一个集合类。以ArrayList来说,通过查看源码得知:在ArrayList中的Iterator(继承父类AbstractList中的Iterator)中发现,当对ArrayList进行迭代时,当调用next()和remove()方法时,会去调用检查方法checkForComodification()去检查是否要抛出ConcurrentModificationException异常。

注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。


具体检查方法:在说具体方法前,先要理解两个变量modCount 和expectedModCount。expectedModCount 当迭代器创建时创建并且赋值为modCount ,并且expectedModCount 不可以被修改,而modCount 当ArrayList每被结构上修改一次modCount ++,随意只要判断expectedModCount 和modCount 两个变量是否一致即可决定是否抛出异常。


所谓结构被修改指的是,当对集合进行add(), remove() 或clear() 操作时,即改变集合的长度时(我是这么理解的-.-)就会改变集合的结构。在这里需要注意一点:当该变集合中元素的取值时,这不是改变集合的结构。


fail-fast解决方法

可以使用java.util.concurrent包中的集合类进行操作。如需要一个ArrayList时可以使用java.util.concurrent中对应的CopyOnWriteArrayList类进行操作。CopyOnWriteArrayList和ArrayList所实现有所不同,CopyOnWriteArrayList没有继承于AbstractList,它仅仅只是实现了List接口。

fail-safe

原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。

缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

fail-fast和fail-safe详解相关推荐

  1. 什么是Fail Fast和Fail Safe?

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

  2. Fail Fast与Fail Safe的区别

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

  3. Fast RCNN多细节详解

    Fast RCNN由来 Girshick, Ross. "Fast r-cnn." Proceedings of the IEEE International Conference ...

  4. 特征点检测 FAST算法及代码详解

    本文着重介绍了用于图像特征点检测的算法,FAST算法,以及使用matlab的实现. FAST算法是一种拐点检测算法,其主要应用于提取图像中的特征点,在动态成像的一系列图像中追踪定位对象.众所周知,我们 ...

  5. Flume常用组件详解之Source

    Flume常用组件详解:Source Flume支持众多的source.sink.拦截器等组件具体实现,详细手册可参考官方文档http://flume.apache.org/FlumeUserGuid ...

  6. ajax then fail done,Jquery $when done then的用法详解

    对于$.ajax请求来说,如果层级比较多,程序看起来会比较乱,而为了解决这种问题,才有了$when...done...fail...then的封装,它将$.ajax这嵌套结构转成了顺序平行的结果,向下 ...

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

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

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

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

  9. DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略

    DL之FastR-CNN:Fast R-CNN算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 目录 Fast R-CNN算法的简介(论文介绍) 1.实验结果 2.Fast R-CNN算 ...

  10. Fast R-CNN论文详解

    Fast R-CNN论文详解 作者:ture_dream &创新点 规避R-CNN中冗余的特征提取操作,只对整张图像全区域进行一次特征提取: 用RoI pooling层取代最后一层max po ...

最新文章

  1. python详细安装教程环境配置-[Python] 安装及环境配置
  2. MATLAB读取文件夹及其所有子文件夹内的图像
  3. 电脑桌面点任何文件都打开计算机,桌面上的文件全部都打不开
  4. Postgresql kill用户进程
  5. CSS 单词折行 word-wrap属性
  6. iOS 控制section不悬停 --- iOS开发系列 ---项目中成长的知识八
  7. CKEditor快速介绍与入门示例
  8. python编程从入门到实战的16堂课_好评如潮,百万Python程序员的「案头必备书」,终于出配套习题解答了!...
  9. iphone 开发第五天 - 集合
  10. wdcp 开启某个Mysql数据库远程访问
  11. 如何在 HTML5 页面中嵌入音频?如何在 HTML5 页面中嵌入视频?
  12. 阿里云混合云新一代运维平台的演进与实践
  13. 生产环境和开发环境_生产环境 VS 开发环境,关于Kubernetes的四大认识误区
  14. Flexsim——初学AGV必看的知识点(如何解决AGV锁死的情况)
  15. php 微信表情字符,微信公众平台开发--表情符号
  16. 在 linux ubuntu 18.04 上运行QQ音乐
  17. 爱快 Open v服务端 全局推送路由器命令
  18. 地震引发的网络关系简化论
  19. 用于时间机器备份的文件服务器地址,一日一技 | 如何解决时间机器在 NAS 上创建备份失败的问题?...
  20. 由Bitlocker问题引发的思考

热门文章

  1. OA办公系统在企业中的主要作用
  2. 个人理财不可忽视的几件小事
  3. [分析与设计]二手房房屋图片功能需求分析与设计
  4. 音视频封装:MP4结构概述和分析工具
  5. Proteus仿真及应用——51单片机系列
  6. wildfly 21的domain配置
  7. Spring原码讲解
  8. Java抽象方法和抽象类
  9. GD32E103/F303系列替换STM32F103
  10. MATLAB 2021b的机器学习、深度学习实践应用