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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。