话不多说,直接上代码
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
while (iterator.hasNext()) {
if ("b".equals(iterator.next())) {
list.add("d");
}
}
当使用以上方法时,会抛出 ConcurrentModificationException 并发修改异常的情况
接下来分析为何会出现以上问题
根据错误信息可以了解到,最终错误其实是由ArrayList的checkForComodification方法导致的,因此可以进入到源码进行查看
可以看到,当 modCount != expectedModCount 时,系统就会抛出ConcurrentModificationException异常
接下来去查看modCount和expectedModCount两个变量是从哪里来的
在ArrayList中没有找到modCount,因此去查看ArrayList的父类AbstractList
成功找到modCount
因为是使用ArrayList的iterator()方法得到迭代器,所以去查看ArrayList的iterator()方法的实现
发现创建了Itr对象并直接返回,在Itr类代码中,可以看到
也就是说,每一次通过iterator()方法得到迭代器时,都会将modCount变量值赋值给expectedModCount
同时,在Itr内部类的next()方法中可以看到
也就是说,每次调用迭代器的next()方法,都会去进行一次判断,一旦发现modCount变量和expectedModCount变量不一致,就会抛出异常
接下来直接跟进ArrayList的add()方法的实现代码
每一次执行add方法时,modCount都会自行+1
由此可以发现,因为每次在使用add方法时,modCount都会 +1,而expectedModCount却未能发生改变,所以在使用next()方法时,会发生异常
while (iterator.hasNext()) {
// 调用next方法时,会先去调用checkForComodification方法进行检测,一旦add方法被调用,
// modCount变量会发生改变,从而抛出异常
if ("b".equals(iterator.next())) {
list.add("d");
}
}