Java中fail-fast和fail-safe的使用
作者:爱写Bug的小孙
在我们开发的过程中,Java集合是写业务代码使用最高频的工具了,当然也是面试官最喜欢问的。
集合中什么是fail-fast和fail-safe?
在Java中,fail-fast和fail-safe是两种不同的迭代器行为,特别是在遍历集合时遇到并发修改的情况。
Fail-Fast(表示快速失败)
快速失败机制是一种保护措施,用于确保在迭代器遍历集合时,集合的结构不会在遍历过程中发生意外改变。它通过维护一个叫做“修改计数器”的东西来实现。每当集合发生结构性修改(比如增加或删除元素),修改计数器就会增加。迭代器在每次遍历之前都会检查这个计数器,如果发现遍历开始前和结束后计数器不一致,就会立即抛出异常,以防止可能导致迭代器出错的情况发生。
代码案例(失败):
import java.util.ArrayList; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; public class FailFastExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); // 在迭代过程中尝试修改集合 list.remove("B"); // 这将导致ConcurrentModificationException } } }
在这段代码中遍历集合过程中尝试删除元素,将触发ConcurrentModificationException
。
Fail-Safe(安全失败)
安全失败机制是一种设计,允许在遍历集合的同时进行修改,而不会导致程序崩溃或出现异常。它通常通过创建集合的一个快照(类似照片一样的备份)或者使用一种特殊的迭代方式来实现。这样,即使在遍历过程中原始集合被改变了,遍历仍然可以继续进行,不会受到影响。Java中的一些并发集合,比如CopyOnWriteArrayList和ConcurrentHashMap.KeySetView,就是利用这种安全失败机制来保证程序在并发修改时的稳定性和可靠性。
代码案例 (安全失败)
import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; public class FailSafeExample { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("A"); list.add("B"); list.add("C"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); // 在迭代过程中尝试修改集合,不会抛出异常 list.add("D"); } } }
在这个例子中,尽管在遍历期间向CopyOnWriteArrayList添加了元素,迭代过程仍能顺利完成,不会抛出任何异常。这是因为CopyOnWriteArrayList在迭代时实际上是在其内部的一个副本上进行的,所以对原集合的修改不会影响迭代过程。
到此这篇关于Java中fail-fast和fail-safe的使用的文章就介绍到这了,更多相关Java fail-fast和fail-safe内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!