2019独角兽企业重金招聘Python工程师标准>>>

fail-fast和fail-safe
前言
前段时间公司招的实习生在使用迭代器遍历的时候,对集合内容进行了修改,从而抛出ConcurrentModificationException. 然后给他讲解之余也整理了这一篇文章.

fail-fast ( 快速失败 )
在使用迭代器遍历一个集合对象时,比如增强for,如果遍历过程中对集合对象的内容进行了修改(增删改),会抛出 ConcurrentModificationException 异常.

查看ArrayList源代码,在next方法执行的时候,会执行checkForComodification()方法

@SuppressWarnings("unchecked")
public E next() {  checkForComodification();  int i = cursor;  if (i >= size)  throw new NoSuchElementException();  Object[] elementData = ArrayList.this.elementData;  if (i >= elementData.length)  throw new ConcurrentModificationException();  cursor = i + 1;  return (E) elementData[lastRet = i];
}  //...............省略.............final void checkForComodification() {  if (modCount != expectedModCount)  throw new ConcurrentModificationException();
}  

原理:

迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量,
集合中在被遍历期间如果内容发生变化,就会改变modCount的值,
每当迭代器使用 hashNext()/next()遍历下一个元素之前,都会检测modCount变量和expectedmodCount值是否相等,
如果相等就返回遍历,否则抛出异常,终止遍历.
举例

//会抛出ConcurrentModificationException异常
for(Person person : Persons){if(person.getId()==2)student.remove(person);
}

注意
这里异常的抛出条件时检测到modCount = expectedmodCount 这个条件.

如果集合发生变化时修改modCount值, 刚好有设置为了expectedmodCount值, 则异常不会抛出.(比如删除了数据,再添加一条数据)

//不会抛出ConcurrentModificationException异常
for(Person person : Persons){if(person.getId()==2){Persons.remove(person);Persons.add(new Person());}
}

所以不能依赖于这个异常是否抛出而进行并发操作的编程, 这个异常只建议检测并发修改的bug.

使用场景 :
java.util包下的集合类都是快速失败机制的, 不能在多线程下发生并发修改(迭代过程中被修改).

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

原理:

由于迭代时是对原集合的拷贝的值进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会出发ConcurrentModificationException
缺点:

基于拷贝内容的优点是避免了ConcurrentModificationException,但同样地, 迭代器并不能访问到修改后的内容 (简单来说就是, 迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的)
使用场景:
java.util.concurrent包下的容器都是安全失败的,可以在多线程下并发使用,并发修改.

转载于:https://my.oschina.net/u/2935389/blog/3039302

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. 聊聊hikari与tomcat jdbc pool的fail fast

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

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

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

  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. 【android录屏填坑】录屏报错start fail,stop fail

    先写个标题,有时间了填充内容. 时隔N天,终于忙完了.内容填充中-- 前言 为什么要写这么一篇文章.因为我最近做录屏实在是被坑哭了.不是遇到start fail报错,就是遇到stop fail报错,这 ...

  8. VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别.ziw

    2017年1月10日, 星期二 VMware网络连接模式-桥接.NAT以及仅主机模式的详细介绍和区别 在使用VMware Workstation(以下简称:VMware)创建虚拟机的过程中,配置虚拟机 ...

  9. MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    深入理解MySQL的数据库引擎的类型 作者: 字体:[增加 减小] 类型:转载 本篇文章是对MySQL的数据库引擎的类型进行了详细的分析介绍,需要的朋友参考下   你能用的数据库引擎取决于mysql在 ...

  10. java 双等号(==) 与equals方法的介绍和区别

    java 双等号(==) 与equals方法的介绍和区别 1.基本数据类型与equals方法 == 用于比较基本数据类型时,比较的是值 ==用于比较引用数据类型时,比较的是地址 equals方法在Ob ...

最新文章

  1. 电脑蓝屏问题检查、解决、
  2. AI一分钟 | 程维成立滴滴股权投资公司;特斯拉董事会决定放弃私有化
  3. python是用什么语言开发的-python是什么语言?哪些人适合学习Python?
  4. 快速排序算法的实现 随机生成区间里的数 O(n)找第k小 O(nlogk)找前k大...
  5. Android编译Libwebcore出错解决方法
  6. Chrome 控制台不完全指南
  7. JavaScript- 正则表达式匹配汉字
  8. php初学遇到的问题。
  9. Python 基础——tuple与list、append与extend
  10. task判断任务是否存在
  11. puml绘制思维导图_在线绘制流程图, 思维导图
  12. installshield 软件使用教程
  13. C程序设计语言——基础概念
  14. 如何实现文件的双向自动同步备份?
  15. Aras Innovator: Catagoy, Itemtype, Item, Relationship的视图
  16. ue4网格转地形_UE4 山脉风景地形模型
  17. 风场可视化与原理剖析
  18. 使用Chrome DevTools的Timeline分析页面性能
  19. 动漫免费在线观看,实时更新,资源全
  20. matlab矩阵保存到表格,将matlab求出的矩阵保存在Excel表格中

热门文章

  1. Scrum卡片层次图
  2. 熟人Dubbo 系列1-Dubbo什么
  3. 第三波精品Android源码袭来!免费下载
  4. [转载]李开复先生给中国学生的第四封信:大学四年应是这样度过
  5. 博客园今天早上是不是出现什么问题了?
  6. Linux 文件系统剖析
  7. 用C语言写PHP扩展
  8. 不畏浮云遮望眼--离散数学和组合数学
  9. 使用Repeater的Template
  10. VS2010使用Skin++