fail-fast(快速失败)是集合类的一种错误检测策略:迭代器创建后,如果集合被迭代器以外的方式结构性修改(增删元素),迭代器立即抛出 ConcurrentModificationException,而不是继续在不一致的状态上运行产生不可预期的结果。
实现原理:集合内部维护一个 modCount 修改计数器,每次结构性修改时递增;创建迭代器时把当前 modCount 记为 expectedModCount;迭代器每次 next() 前检查两者是否相等,不等即抛异常。这是通过状态快照比对实现的轻量级检查。
List<String> list = new ArrayList<>(List.of("a", "b", "c"));
for (String s : list) {
if (s.equals("b")) list.remove(s); // 抛 ConcurrentModificationException
}
// 正确做法:用迭代器自身的 remove
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("b")) it.remove(); // 迭代器会同步更新 expectedModCount
}
注意:fail-fast 是"尽力而为"的检测,JDK 文档明确说明不保证绝对生效(无同步时修改的可见性不确定),不能拿它当并发控制手段;多线程共享集合应使用并发容器。对应概念是 fail-safe:并发容器(如 CopyOnWriteArrayList)在快照上迭代,不抛异常。
追问方向:subList 视图与原列表的 modCount 联动问题?
(约 360 字)