简介

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. OpenCV实现失焦模糊图像恢复
  2. Attack on Alpha-Zet
  3. Java 重定位 —— redirect:
  4. 【数据分析】《唐探3》口碑急转直下?看看影迷们到底都说了些啥
  5. vue - blog开发学习3
  6. matlab转向梯形优化设计,转向梯形优化设计matlab程序.doc
  7. 用 Flink 取代 Spark Streaming,知乎实时数仓架构演进【推荐】
  8. jmeter之关联操作
  9. 手把手教你用原始方式上传项目至GitHub
  10. ps右键不显示编辑选项_0基础小白能上手的AE动态插画教程你还不知道么?
  11. python能学到什么-学习python三个月能学到什么?
  12. 从零实现深度学习框架——动手实现逻辑回归
  13. 卧槽!你竟然不晓得Java中可以用 :: 吗?
  14. 安卓 xdroid framework
  15. 制作背景透明图标的小工具(附源代码)
  16. Spring Boot(三):RestTemplate提交表单数据的三种方法
  17. 复旦大学计算机学院江湾校区,复旦大学江湾校区
  18. 学无止境的CSS(xHTML+CSS技巧教程资源大全)
  19. 我的苹果电脑中毒了?mac也会中病毒?喜闻乐见(附杀毒软件测试)
  20. PHP代码实现反弹shell

热门文章

  1. 163个人域名邮箱哪个好用?TOM商务邮箱移动办公oa系统
  2. 通过开源的webdav-aliyundriver+Rclone挂载阿里云盘到服务器
  3. Linkage mapper 重大事故——文末问卷链接咨询
  4. 部署Ambari 2.7.5 + HDP3.1.5
  5. 多元微积分_多元连式法则2 多元连式法则与方向向量
  6. linux中make命令报错,Linux命令make报错总结
  7. C#版俄罗斯方块含部分代码
  8. 基于QT和UDP Socket实现的即时通信软件
  9. DL20 Gen9 server 安装 Raid
  10. 【代码随想录二刷】Day20-二叉树-C++