ConcurrentModificationException 异常发生原因

首先 ConcurrentModificationException 是在遍历时发生的.

背景知识:
  • 遍历分为 fori, foreach, iterator 三种方式
  • fori 在删除 / 新增元素时, 多线程下可能导致数组索引越界 / 数据混乱 (因为索引对不上)
  • foreach, iterator 可能导致 ConcurrentModificationException
  • 集合使用 foreach 底层本质上是调用的 iterator
ConcurrentModificationException 异常原因有两种情况 (本质上的逻辑都是checkForComodification(), 即比较 list.modCount == itr.expectedModCount):
  • 单线程下 foreach / iterator 遍历时, 使用 list.remove() 会抛出异常 (modCount 被修改, 但是 expectedModCount 还是旧值, 抛出异常)
  • ConcurrentModificationException 异常发生原因ConcurrentModificationException 异常发生原因
  • ConcurrentModificationException 异常发生原因
  • 多线程下 foreach / iterator 遍历时, 使用 iterator.remove() 可能会抛出异常 (虽然 iterator.remove() 方法会重新把 expectedModCount 的值复制给 modCount. 但是存在线程安全问题. 在 iterator.next() 方法时, 还会校验 modCount == expectedModCount, 不等则抛出异常)
    ConcurrentModificationException 异常发生原因