概述
首先,看一个例子
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
// java.util.ConcurrentModificationException
并发修改异常!
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
new Thread(()->{
//Universally Unique Identifier,通用唯一识别码
//UUID 是由一组32位数的16进制数字所构成,故 UUID 理论上的总数为16^32=2^128
list.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
此时运行,就会报java.util.ConcurrentModificationException。
为什么会出现并发修改异常呢?
是因为,在打印list的时候,调用了toString(),ArrayList的toString()方法继承自AbstractCollection,里面是调用了Iterator迭代器进行输出。进行输出是触发了fail-fast 机制。
解释一下fail-fast 机制,java集合(Collection)中有一种错误检测机制,即fail-fast 机制。在我们常用的ArrayList和LinkedList中,采用了该机制,当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。比如,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程B所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
然后说一下迭代器遍历调用next方法,next方法调用了一个checkForComodification()方法来判断“预期修改次数modCount”和“实际修改次数expectedModCount”,迭代器遍历List的同时add数据的话“modCount”会自增加一,这样的话“expectedModCount”和“modCount”就不相等,所以抛出并发修改异常。
最后
以上就是苗条龙猫为你收集整理的list集合操作时的ConcurrentModificationException并发修改异常解析的全部内容,希望文章能够帮你解决list集合操作时的ConcurrentModificationException并发修改异常解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复