1.前言
在ArrayList和HashMap等集合中,我们经常可以看到modCount++
,这个操作是用来记录新增,修改,删除等操作数的。
2.并发修改异常出现原因
在调用iterator()
后会创建一个迭代器,此时迭代器对象内会维护一个成员变量
// 记录当前操作数
int expectedModCount = modCount;
在迭代器内部的每个操作前都有一个checkForComodification();
方法,这个就是用来检测是否触发了并发修改异常
final void checkForComodification() {
// 当集合类进行增删改时,modCount发生改变,与迭代器内部的expectedModCount不一致。
// 这就是并发修改异常
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
3. 为啥迭代器内部的增删改没有问题呢?
迭代器内部的增删改还是调用的集合本身的增删改。即modCount++,但是迭代器会将expectedModCount重新赋值。这样就能保证modCount与expectedModCount一致了,不会出现ConcurrentModificationException异常
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9k9DLZBv-1621328506032)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/93f6f3ef-3872-4535-adfd-c616f6f783ad/Untitled.png)]