Java中fail-fast和fail-safe的使用

 更新时间:2024年08月18日 11:56:53   作者:爱写Bug的小孙  
fail-fast和fail-safe是两种不同的迭代器行为,特别是在遍历集合时遇到并发修改的情况,本文主要介绍了Java中fail-fast和fail-safe的使用,感兴趣的可以了解一下

在我们开发的过程中,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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot集成springsecurity 使用OAUTH2做权限管理的教程

    springboot集成springsecurity 使用OAUTH2做权限管理的教程

    这篇文章主要介绍了springboot集成springsecurity 使用OAUTH2做权限管理的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 浅谈Java内存模型之happens-before

    浅谈Java内存模型之happens-before

    于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程A修改了变量a何时对线程B可见?下面小编来简单介绍下
    2019-05-05
  • 一文搞懂JMeter engine中HashTree的配置问题

    一文搞懂JMeter engine中HashTree的配置问题

    本文主要介绍了JMeter engine中HashTree的配置,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Maven pom.xml 添加本地jar包依赖以及打包方法

    Maven pom.xml 添加本地jar包依赖以及打包方法

    这篇文章主要介绍了Maven pom.xml 添加本地jar包依赖以及打包方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring的实例工厂方法和静态工厂方法实例代码

    Spring的实例工厂方法和静态工厂方法实例代码

    这篇文章主要介绍了Spring的实例工厂方法和静态工厂方法实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • @Autowired注解以及失效的几个原因图文详解

    @Autowired注解以及失效的几个原因图文详解

    在微服务项目中,会遇到@Autowired注解失效的情况,下面这篇文章主要给大家介绍了关于@Autowired注解以及失效的几个原因的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 浅谈springboot项目中定时任务如何优雅退出

    浅谈springboot项目中定时任务如何优雅退出

    这篇文章主要介绍了浅谈springboot项目中定时任务如何优雅退出?具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot2 task scheduler 定时任务调度器四种方式

    SpringBoot2 task scheduler 定时任务调度器四种方式

    这篇文章主要介绍了SpringBoot2 task scheduler 定时任务调度器四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 深入理解Spring中的循环依赖

    深入理解Spring中的循环依赖

    Spring在注入bean的时候会做循环依赖检查,下面这篇文章主要给大家介绍了关于Spring中循环依赖的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-05-05
  • Java获取七牛云存储空间中图片外链

    Java获取七牛云存储空间中图片外链

    本文主要介绍了Java获取七牛云存储空间中图片外链,需要获取在七牛云中存储的所有图片,并返回外链地址,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10

最新评论