https://www.cnblogs.com/dolphin0520/p/3933551.html
基础知识
1. 每个列表有如下一个字段:
- modCount:修改的次数
2. 每个列表生成的迭代器有一个字段
- expectedModCount:预期修改的次数
3. 在每次操作列表和迭代器时会先对比modeCount和ExpectedModCount两个数量是否相等。
原理
- 由于在循环时直接对列表对象删除元素,会导致expectedmodCount增加而modeCount不增加,从而不一致报错。
- 而通过Iterator.remove()进行操作时,会同时更新列表和迭代器的这两个值。在单线程情况下,这样就不会导致不一致。
- 但如果在多线程情况下操作时,由于每个线程有自己的iterator,从而有自己的expectedModCount,但modCount都指向同个列表,多线程操作时就会出现不一致的情况。