Java集合迭代失效的本质是modCount与expectedModCount不一致触发ConcurrentModificationException,属fail-fast保护机制而非线程安全问题;需用iterator.remove()、线程安全集合或延迟修改规避。

Java 集合迭代失效的本质是:迭代器内部维护的 modCount 与集合实际修改次数不一致,触发 ConcurrentModificationException。
核心机制一句话
所有基于 fail-fast 设计的集合(如 ArrayList、HashMap)在迭代过程中,若集合结构被外部线程或同一线程的其他代码修改(增/删),迭代器会检测到 modCount != expectedModCount,立即抛出异常——这不是线程安全问题,而是快速失败的保护机制。
常见失效场景与规避方式
-
遍历时直接调用集合的
remove()或add()→ 改用迭代器自身的iterator.remove() -
多线程并发读写同一集合 → 改用线程安全替代品(
CopyOnWriteArrayList、ConcurrentHashMap)或加锁 -
嵌套循环中修改外层集合 → 提前收集待操作元素,遍历结束后统一处理(如用
removeAll()或新建集合过滤)
关键细节点睛
注意:get()、set() 不改变结构,不会触发失效;forEach 和增强 for 循环底层仍依赖迭代器,同样受 fail-fast 约束;fail-safe 集合(如 ConcurrentHashMap 的 keySet 迭代)则基于快照,不检查 modCount,不会抛该异常。
本质上,这是设计取舍:用运行时异常换开发阶段的明确错误提示,而非静默出错或数据不一致。
立即学习“Java免费学习笔记(深入)”;


















