ConcurrentModificationException异常

2017/2/12 17:23 下午 posted in  并发编程  

原因

AbstractList类的方法checkForComodification()如下:

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

其中modCount为AbstractList的成员变量,表示对list的修改次数,每次调用ArrayList的add()、remove()方法时该值+1;而expectedModCount为AbstractList的内部类Itr的成员变量,表示对list修改次数的期望值,初始时,二者值相等。

发生该异常的原因是调用list.remove()导致modCount与expectedModCount不相等。

单线程环境下解决办法

调用Itr中的remove()方法,该方法实际上也是调用的list.remove(),但多了expectedModCount = modCount的操作。

多线程环境下解决办法

将ArrayList改为Vector并不能解决问题,因为Vector继承自AbstractList,所以通过Iterator来访问容器时,并不需要获取锁。因此会出现多个线程同时操作一个容器的情况,可能会导致某个线程中的expectedModCount与modCount不相等。

2种解决办法:
1. 通过Iterator迭代的时候使用synchronized或lock进行同步;
2. 使用并发容器CopyOnWriteArrayList代替ArrayList和Vector。

参考

Java ConcurrentModificationException异常原因和解决方法