在软件开发中,fail-fast(快速失败)是一种设计思想,一旦检测到可能会发生错误,就立马抛出异常,程序将不再往下执行。
举一个例子:在 Java 集合框架中,fail-fast 机制通过检测集合的结构变化来防止非法修改,确保迭代过程中的一致性。
在 Java 编程中,fail-fast 主要体现在集合框架中,例如 ArrayList、HashMap 等集合类。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FailFastExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
// 修改集合结构,触发 fail-fast 机制
list.add("four");
}
}
}
运行结果:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
at java.util.ArrayList$Itr.next(ArrayList.java:861)
at com.mikechen.java.basis.FailFastTest.main(FailFastTest.java:17)
fail-fast 行为在迭代过程中检测到集合的结构发生变化时,会抛出 ConcurrentModificationException,从而避免在未知状态下继续操作。
原理:
在集合类(如 ArrayList)中,fail-fast 机制通常通过一个被称为 modCount(修改计数器)的变量实现。
当集合的结构发生改变(如添加或删除元素)时,modCount 会增加。在创建迭代器时,会将 modCount 的值赋给迭代器的一个私有变量 expectedModCount。
在迭代过程中,迭代器会比较 modCount 和 expectedModCount 的值,如果两者不相等,则表示集合的结构已被修改,迭代器会抛出 ConcurrentModificationException。
fail-fast 这种策略有助于更快地定位问题,减少调试时间,提高系统的可靠性和稳定性。
mikechen睿哥
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。