CodeWalk

fail-fast和fail-safe机制的区别?

作者:孤独的心 · 2026-05-30 12:55

请解释Java集合中的fail-fastfail-safe两种迭代器机制。说明各自的触发条件、实现原理、典型代表类以及适用场景。

回答

孤独的心

fail-fast(快速失败)

  • 原理:迭代器遍历时通过modCount字段检测结构性修改。每次next()检查expectedModCount == modCount,不相等则抛出ConcurrentModificationException
  • 触发:单线程迭代中直接调用集合的add/remove(非迭代器方法);多线程一个迭代另一个修改
  • 代表类:ArrayList、HashMap、HashSet等java.util包大部分集合
  • 优点:及时暴露并发修改问题

fail-safe(安全失败)

  • 原理:迭代器遍历的是原集合的副本/快照,而非原集合本身。对原集合的修改不影响副本的遍历
  • 代表类:CopyOnWriteArrayList、ConcurrentHashMap的KeySetView迭代器
  • 优点:遍历时允许其他线程修改集合,不会抛出异常
  • 缺点:
    1. 无法保证读到最新数据(弱一致性)
    2. 内存开销大(需要复制)

总结:fail-fast保证强一致性但可能抛出异常;fail-safe牺牲一致性以换取高并发。