fail-fast 机制

简介: 标题master 集合元素个数的增加或删除,均会导致子列表的遍历、增加、删除进而产生 fail fast 异常。
public static void main (String[] args) {
List masterList = new ArrayList();
masterList . add (”one") ;'
masterList . add (” tow" );
masterList . add (” three " );
masterList . add (” four " ) ;
masterList . add (” five " ) ;
List branchList = masterList.subList( 0 , 3 ) ;
//下发三行代码,如果不注释掉则会导致branchList 操作出现异常(第一处)
//masterList . remove( 0);
//masterList . add (” ten ” );
//masterList.clear() ;
//下方四行全部能正确执行
branchList.clear() ;
branchList . add (” six " );
branchList . add (” seven” );
branchList.remove( 0);
//正常遍历结束,只有一个元素
for (Object t : branchList) {
System . out . println(t);
// 子列表修改导致住列表也被动,输出:[seven,four,five]
System out.println(masterList );

第一处说明,如果不注释掉, masterList 的任何关于元素个数的修改操作都会导branchList 的“增删改查”抛出 ConcurrentModificati onException 异常。在实际调研中
大部分程序员知道 subList 子列表无法序列化 也知道它的修改会导致主列表的修改但是并不知道主列表元素个数的改动会让子歹lj 表如此敏感,频频抛出异常。在实际代码中,这样的故障案例属于常见的类型。 subList 方法返回的是内部类 SubList 的对象SubList 类是 Array ist 的内部类, SubList 的定义如下 并没有实现序列化接口 无法网络传输:

在集合遍历时维护一个初始值为0的游标cursor,从头到尾地进行扫描,在cursor=-size时,退出遍历。如图6-2所示,执行remove这个元素后,所有元素往前拷贝,size=size-1即为2,这时 cursor也等于2。在执行hasNext()时,结果为false,退出循环体,并没有机会执行到next()的第一行代码checkForComodification(),此方法用来判断expectedModCount和 modCount是否相等,如果不相等,则抛出ConcurrentModificationException异常。

目录
相关文章
|
12天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
41 5
|
Java 容器
Iterator_fail-fast和Iterator_fail-safe~
Iterator_fail-fast和Iterator_fail-safe~
|
6月前
|
安全 Java 容器
浅谈从fail-fast机制到CopyOnWriteArrayList使用
浅谈从fail-fast机制到CopyOnWriteArrayList使用
49 0
|
Java
什么是fail-fast
什么是fail-fast
63 0
|
监控 安全
故事会【Fail-safe和Fail-fast】
故事会【Fail-safe和Fail-fast】
|
安全 Java 容器
什么是fail-fast和fail-safe?
本章讲解了什么是fail-fast和fail-safe,以及如何解决
104 0
|
Java
【Java】从源码分析fail-fast和fail-safe是如何产生的
【Java】从源码分析fail-fast和fail-safe是如何产生的
79 0
|
Java API
Java - Java集合中的快速失败Fail Fast 机制
Java - Java集合中的快速失败Fail Fast 机制
81 0
|
安全 Java
fail-safe 和 fail-fast 硬核解析,让你和面试官多聊十分钟!
简介 java.util 包下的 属于 fail-fast , 快速失败~ 😝 java.util.concurrent 包下的 属于 fail-safe ,安全失败~ 😝 简单来说 就是 fail-fast 在迭代时,如果发现 该集合数据 结构被改变 (modCount != expectedModCount),就会 抛出 ConcurrentModificationException 小伙伴们可以参考下 下面的代码简单实验一下~ 😋 fail-fast 实验代码 实验对象是 Hashtable,这里采用 jdk1.7 的写法 ~ 因为博主还在研究 下文
225 0