fail-fast(快速失败)是什么?

在软件开发中,fail-fast(快速失败)是一种设计思想,一旦检测到可能会发生错误,就立马抛出异常,程序将不再往下执行。

举一个例子:在 Java 集合框架中,fail-fast 机制通过检测集合的结构变化来防止非法修改,确保迭代过程中的一致性。

在 Java 编程中,fail-fast 主要体现在集合框架中,例如 ArrayListHashMap 等集合类。

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

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法