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

fail-fast 与所谓 fail-safe 有什么区别?

查看完整题解

参考回答

直接回答

fail-fast 指迭代器发现不允许的结构修改时,尽早抛出 ConcurrentModificationException。所谓 fail-safe 并不是 Java 集合规范中的统一分类:有人用它指快照迭代,也有人把弱一致迭代算进去。面试时应说明具体集合的迭代语义,不能一概说“安全失败就是复制集合”。

讲清原理

ArrayList 的迭代器会尽力检查结构变化。这是帮助发现错误的机制,不是并发安全保证;检查也不保证一定捕获所有并发修改。单线程里一边用迭代器遍历、一边通过 list.remove 修改,也可能出错。

CopyOnWriteArrayList 的迭代器观察创建时的快照,看不到之后的增删;ConcurrentHashMap 的迭代器是弱一致的,可能观察到部分后续变化,但不是固定快照。两者通常都不靠抛出该异常来报告修改。

例子与易错点

var values = new java.util.ArrayList<>(java.util.List.of(1, 2, 3));
var it = values.iterator();
while (it.hasNext()) {
    if (it.next() == 2) it.remove();
}
System.out.println(values); // [1, 3]

在允许删除的迭代器上使用 it.remove(),与绕过迭代器修改集合不同。它也不意味着这个集合从此可以被多个线程随意修改。

相关题:第 4 题、第 42 题。

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

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