优先考虑出现异常的场景,当程序出现异常的时候,直接抛出异常,随后程序终止

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List; class Main{
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Collections.addAll(list,"A","B","C","D");
//modCount = 4,从0开始
Iterator<String> iterator = list.iterator();//取得集合迭代器(取得当前集合的副本),expectedModCount = 4
//当取得集合迭代器的时候(及调用list.iterator()),expectedModCount=modCount
while(iterator.hasNext()){
String str = iterator.next();//每次调用这句代码时候 会调用checkForComodification()
//以此来检查副本中的expectedModCount是否等于集合中的modCount,为了安全考虑(保证不会脏读)
if(str.equals("B")){
//list.remove("B"); //modCount +1=5 ConcurrentModificationException
iterator.remove();
continue;
}
}
}
}

fail-fast机制
ConcurrentModificationException,Collection集合使用迭代器遍历的时候,使用了集合类提供的修改集合内容方法报错
产生原因:

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}

collection集合中的modCount表示当前集合修改的次数(remove,add调用的时候,modCount++)
在并发使用的场景中如果发生值的修改保证用户独到的是当前集合的最新值,而不会发生脏读
当取得集合迭代器的时候(及调用list.iterator()),expectedModCount=modCount
换言之,迭代器就是当前集合的一个副本

而如果是有了Iterator迭代器提供的remove()不会出现此错误,本质上在remove时候将modCount重新赋值给expectedModCount

fail safe集合
不抛出此异常的集合
fail-safe:不产生ConcurrentModificationException异常
juc包下线程安全的集合类(CopyOnWriteArrayList、ConcurrentHashMap)

总结:以后在迭代器遍历的时候,不要修改集合的内容

1.为何产生fail fast?
ModCount expectedModCount存在于内部迭代器实现,存储当前集合修改次数
modCount存在于AbstractList记录List集合被修改(add remove)的次数
2.fail fast的意义:保证多线程场景下读取数据不会发生脏读,当有一个线程修改集合的时候,告诉客户端拿到的数据并非最新的
当执行list.remove()的时候,判断元素的下标,使用fastRemove,此时modCount++,不再等于expectedModCount

最新文章

  1. IBatis和Hibernate区别
  2. Untiy3D - 窗口界面1
  3. iOS之UI--辉光动画
  4. leiningen安装记录
  5. &lt;原&gt;ASP.NET 学习笔记之HTML helper中参数何时会是路由参数,何时又会是query string?
  6. 第二次项目冲刺(Beta阶段)--第二天
  7. C# 接口使用方法
  8. weblogic---- Remote远程调用
  9. Java并发编程(一)线程定义、状态和属性
  10. Bootstrap 导航元素(标签页)
  11. WebGL 着色器语言(GLSL ES)
  12. Java学习--java中的集合框架、Collection接口、list接口
  13. springboot对security的后端配置
  14. Pycharm 建立工程,包含多个工程目录
  15. java中jar打包的方法
  16. NET Core Web API下事件驱动型架构CQRS架构中聚合与聚合根的实现
  17. QXDM及QCAT软件使用入门指南V1.0
  18. TDD随想录
  19. 关于小程序报错 缺少文件,错误信息:error: iconPath=../images/home.png, file not found
  20. hdu 5068(线段树+矩阵乘法)

热门文章

  1. React源码 ReactDOM.render
  2. 1. Ubuntu下使用pip方式安装tensorflow
  3. Spring中@Autowired、@Resource和@Inject注解的使用和区别
  4. Chrome调试 ---- 控制台获取元素上绑定的事件信息以及监控事件
  5. 使用Git管理品优购项目 开始部分
  6. crystalreport使用方法
  7. erlang程序设计--顺序编程
  8. LeetCode 622. Design Circular Queue
  9. 基于react开发package.json的配置
  10. three.js 基础使用1