目录
并发修改异常简介
-
什么是并发修改异常
-
并发的意思是同时发生,并发修改的意思是在同时发生某个时间时去修改。
-
并发修改异常的原因是:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
-
-
场景:当我们在对集合进行迭代遍历操作的时候,如果同时对集合对象中的元素进行某些操作(增删),则容易导致并发修改异常的产生。
异常展示
-
我们创建一个ArrayList数组,当数组中有“world”元素时,我们增加一个“javaee”元素
import java.util.ArrayList;
import java.util.Iterator;
public class TestDemo {
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<>();
//创建并添加元素
array.add("hello");
array.add("world");
array.add("java");
Iterator it = array.iterator();
while (it.hasNext()){
String s =(String) it.next();
if ("world".equals(s)){
array.add("javaee");
}
}
}
}
报错原因:Exception in thread "main" java.util.ConcurrentModificationException (并发 修改异常)
异常原因
-
通过控制台找到问题产生的根源
Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)//问题根源 at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at TestDemo.main(TestDemo.java:15)
-
查看根源方法代码
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException();//抛出并发异常 }
-
原因:由异常根源的方法内容得知,当一个变量modCouunt 不等于 expectedModCount变量时,会抛出此异常
异常探究
接下来探究modCount与expectedModCount具体代表什么
-
modCount
-
在抽象类AbstractList定义了modCount变量,而作为他的子类ArrayList继承到了modCount这个变量
-
源码中对于modCount的解释
-