在软件开发中,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
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

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