回答此类问题的一种好方法是查看源代码,例如ArrayList的源代码。搜索
ConcurrentModificationException。
您应该能够说出事情的运作方式是这样的:
- 集合对象具有修改计数,该修改计数从零开始,并在发生添加或删除或类似操作时增加。
- 创建迭代器对象时,我们将集合的当前修改计数存储在迭代器中。
- 每次使用迭代器时,它都会根据创建迭代器时获得的mod计数来检查集合的mod计数。如果这些值不同,则会引发异常。
根据您的情况,通过
iterator1对列表执行删除操作会更改列表的结构操作计数(
modCount)。当
iterator2要求删除它时,它会看到其
expectedModCount,最初接收为0,与列表的当前mod计数不同。
应当指出,这
it.remove是一种特殊情况。当迭代器自行执行删除操作时,它会进行
expectedModCount相应调整,以与基础列表保持同步。



