原因
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。