You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么调用ArrayList.add方法时会抛出ConcurrentModificationException异常?

问题根源

ConcurrentModificationException 由Java集合的fail-fast校验机制抛出,checkForComodification 是该机制的核心校验方法,触发场景分为两类:

  • 单线程场景:当前执行dogList.add(nthDog)的代码,正处于dogList的遍历逻辑中。使用增强for循环(foreach)、迭代器遍历集合的过程中,直接调用集合本身的add/remove方法修改集合结构,就会触发该异常。
  • 多线程场景:dogList被声明为static静态全局变量,若存在多线程并发操作的情况,例如一个线程正在遍历集合,另一个线程执行add操作修改集合结构,也会触发异常。
修复方案

单线程场景处理

遍历过程中需要修改集合结构时,使用ListIterator提供的add/remove方法操作:

ListIterator<Dog> iterator = dogList.listIterator();
while (iterator.hasNext()) {
    Dog item = iterator.next();
    // 满足新增条件时执行
    iterator.add(nthDog);
}

如果不需要在遍历过程中新增,可以先把待新增的对象存入临时集合,等遍历结束后统一调用dogList.addAll()批量添加。

多线程场景处理

两种可选方案:

  • 替换集合实现为线程安全的CopyOnWriteArrayList,修改声明代码:
private static CopyOnWriteArrayList<Dog> dogList = new CopyOnWriteArrayList<>();
  • 给所有操作dogList的代码块加synchronized同步锁,保证同一时间只有一个线程操作集合。

内容的提问来源于stack exchange,提问作者Melony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:36:03