Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

fail-fast 快速失败机制是什么?

查看完整题解

参考回答

直接回答

fail-fast 是某些迭代器尽早发现不允许的结构修改并抛 ConcurrentModificationException 的机制。ArrayList 等实现通常比较修改计数与迭代器记住的计数。它只是尽力发现误用,不保证检测所有竞争,也不提供线程安全;单线程修改不当同样可能触发。

讲清原理

迭代器开始遍历时,记住一个预期版本;外部添加或删除元素可能改变容器版本,继续遍历时若发现不一致就失败。通过当前迭代器合法 remove 时,实现会同步更新自己的预期状态。

替换某个既有槽位的值不一定属于结构修改,具体要看容器约定。CopyOnWriteArrayList 的迭代器读旧数组快照;ConcurrentHashMap 使用弱一致迭代。这两者不应笼统叫作一个有正式统一含义的“fail-safe”模式。

快速失败检测改动,快照固定旧数组,弱一致遍历容许并发变化
快速失败检测改动,快照固定旧数组,弱一致遍历容许并发变化

例子与易错点

Java 21 的 main 片段:

var list = new java.util.ArrayList<>(java.util.List.of(1, 2));
var it = list.iterator();
list.add(3);
try {
    it.next();
} catch (java.util.ConcurrentModificationException expected) {
    System.out.println("检测到结构修改");
}

在此确定的单线程步骤中输出“检测到结构修改”。不要故意让多个线程无同步竞争,再依赖“总会抛异常”保证正确;检测没发生不代表访问是安全的。

相关题:第 7 题、第 22 题、第 35 题、第 36 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。