Java fail-fast 机制

Fail-Fast与Fail-Safe:深入理解Java中的这两种机制 Fail-Fast指的是一种设计哲学,即当系统检测到一个不一致或错误时,立即失败(抛出异常),而不是继续执行可能产生不确定结果的操作。这种机制的目的是尽快地发现错误,避免潜在的更严重的问题。Fail-Safe是另一种设计机制,它确保系统在发生故障时仍然能够安全地运行,不会崩溃或产生不可预测的行为。Fail-Safe机制通常通过创建数据的副本或使用锁机制来实现,以确保在操作过程中数据的一致性和完整性。Fail-Fast和Fail-Safe是Java编程中两种重要的机制,它们分别适用于不同的场景。 阅读详情

简介

  fail-fast 机制,即快速失败机制,是 Java 集合(Collection)中的一种错误检测机制,检测在迭代期间集合被修改的情况。fail-fast 机制并不保证在不同步的修改下一定会抛出异常,它只是尽最大努力去抛出,所以这种机制一般仅用于检测 bug。

示例

  在集合中,当直接使用 Iterator 迭代(而不是通过 for-each 循环间接使用),对正在被迭代的集合进行结构上的改变(即对该集合使用 add、remove 或 clear 等方法),那么迭代器就不再合法,发生 fail-fast,抛出 ConcurrentModificationException 异常。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);list.add(2);list.add(3);
        
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            list.add(4);// 引起fail-fast 
        }
    }
}

在这里插入图片描述

原理

  由以上示例,我们通过 ArrayList 中的 Iterator 来剖析 fail-fast 机制原理,分析 ArrayList 中的 Iterator 如何实现 fail-fast 机制,如何抛出 ConcurrentModificationException 异常。

调用 iterator() 获取 Iterator 对象

  它会返回一个 Itr 类的对象,而 Itr 类是 ArrayList 的内部类,实现了 Iterator 接口。

public Iterator<E> iterator() {
    return new Itr();// 返回一个Iterator对象
}

Itr 类的成员变量 expectedModCount

  cursor 和 lastRet 都很好理解,我们需要重点关注 expectedModCount,在此之前,我们先搞清楚 modCount 是什么?
  modCount 是 ArrayList 的一个成员变量,在 ArrayList 被创建即存在并初始化,modCount 含义为记录从创建后 ArrayList 的修改次数,add、remove 、clear 等方法都会引起 modCount 值的增加。
  在创建了 Itr 对象时,将 modCount 储存在数据域 expectedModCount 中,可以理解为保存 ArrayList 当前状态。

private class Itr implements Iterator<E> {
	int cursor;    // 下一个返回元素的索引,开始为0
	int lastRet = -1; // 最近返回的元素的索引,没有则为-1
	int expectedModCount = modCount;
	......
}
public E remove(int index) {// ArrayList的remove方法(截取)
	......
	modCount++;// 每次调用都会增加modCount的值
	......
}

Itr 类的成员函数 checkForComodification()

  Itr 类中有一个 checkForComodification() 方法,专门用于检测最新的 modCount 是否等于 expectedModCount,经过前面的分析,可以知道在 ArrayList 进行add,remove,clear 等涉及到修改集合结构的操作时,modCount 就会发生改变(modCount++),所以当使用迭代器时改变集合结构或多线程环境中操作集合,就会使 modCount 发生变化,这样在 checkForComodification 方法中就会抛出 ConcurrentModificationException 异常。
  这样即可检测 ArrayList 的状态是否改变过,如果状态改变就抛出 ConcurrentModificationException 异常,这样即实现了fail-fast 机制,通过源码可以看出,每一次 next 和 remove 的调用都会调用 checkForComodification 进行检测。

final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}
public E next() {
	......
    checkForComodification();
	......
}

public void remove() {
	......
    checkForComodification();
	......
}

避免 fail-fast

单线程环境

  在单线程的遍历过程中,如果要进行 add、remove 等操作,调用迭代器的 add、remove 方法而不是集合类的 add、remove 方法。

多线程环境

  在多线程环境中使用 Java 并发包(java.util.concurrent)中对应的类来代替 ArrayList 和 HashMap。
  比如使用 CopyOnWriterArrayList 代替 ArrayList,使用 ConcurrentHashMap 代替 HashMap。

Java集合中的 Fail-Fast 与 Fail-Safe 机制全面分析 在 Java 中,集合类的遍历操作在多线程环境下可能会遇到并发修改的问题。fail-fast和fail-safe。它们各自的实现和应用场景有所不同。在本文中,我们将全面分析这两种机制,并通过具体示例,讲解异常机制、和的使用以及遍历过程中集合修改的安全策略。Java 集合中的 fail-fast 和 fail-safe 机制为开发者提供了不同的并发控制方式。通过了解和使用这些机制,可以更有效地处理多线程环境中的集合遍历和修改操作。通过。 阅读详情

相关推荐

卸载Office 16 Click-to-Run Extensibility Component详细步骤

卸载Office 16 Click-to-Run Extensibility Component详细步骤 第一步:按住键盘上的“Win+R”,打开运行窗口 在运行窗口输入“Installer”回车,打开Installer文件夹 第二步:在Installer文件夹红框最右侧,即“大小”后面,右击选择“其他”,找到“主题”,勾选,点击“确定”,添加主题列成功 第三步:在“主题”列找到“Office 16 Click-to-Run Extensibility Component

M_try的博客 3万+

Java中的fail-fast机制

fail-fast 机制是Java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

qq_25409421的博客 3万+

数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案

数字IC后端实战项目案例之Innovus verify_drc DRC Violation脚本自动化修复方案

weixin_37584728的博客 4042

springboot validation 检验模式

springbootvalidation检验模式 默认:对pojo的所有参数进行检验,如果检验出错,返回所有错误 fail-fast:检验到参数出错就返回当前错误,不需要检验所有的参数 ************************* 示例 ******************* pojo层 ...

weixin_43931625的博客 725

DSP28335与Vofa+上位机通信实战:SCIb配置避坑指南(附完整代码)

本文提供DSP28335与Vofa+上位机通信的实战指南,重点解析SCIb模块配置的常见问题与解决方案。针对研旭开发板的硬件连接、波特率精确计算、FIFO高效使用以及FireWater协议封装进行了详细说明,并附有完整代码,帮助开发者快速实现实时数据可视化与波形分析,提升调试效率。

weixin_29172963的博客 150

使用电荷放大器处理压电加速度计输出

电阻器 R p模拟传感器的绝缘电阻,为产生的电荷创建泄漏路径。在此图中,顶部波形显示传感器产生的电荷,而底部波形显示电荷放大器的输出。这需要具有大输入阻抗的放大级,以防止产生的电荷通过与传感元件并联的放大器的输入阻抗泄漏。换句话说,电荷放大器补偿传感器产生的电荷 q p ,反馈电容器 C F中具有相反极性的等量电荷。因此,任何与传感器并联的绝缘电阻,如电缆的绝缘电阻或传感器的漏电电阻Rp,都不能流过电流。漂移是指电荷放大器输出在一段时间内发生的变化,而不是由被测物理参数的变化(我们讨论的加速度)引起的。

weixin_45260069的博客 3904

学妹问我,迭代遍历集合时为什么不能删除和添加?

有学妹问我,集合迭代遍历时删除时会抛出ConcurrentModificationException异常导致遍历失败,今天就教她操做操做 ail-fast和fail-safe的区别: fail-safe允许在遍历的过程中对容器中的数据进行修改,而fail-fast则不允许。 fail-fast ( 快速失败 ) fail-fast:直接在容器上进行遍历,在遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常导致遍历失败。java.uti.

Mr.品梵的博客 1274

Linux CentOS7文件系统(/dev/var)的容量扩充

原因是之前安装docker后,再想安装Nessus,系统说home、var文件系统的内存都不够。

JHoanna的博客 3224

java fail-fast机制详解

即,当多个线程对同一个集合进行操作的时候,某线程访问集合的过程中,该集合的内容被其他线程所改变(即其它线程通过add、remove、clear等方法,改变了modCount的值);我们先看看 Iterator 的源码。在“线程a”在遍历arrayList过程中的某一时刻,“线程b”执行了,并且“线程b”删除了arrayList中的“节点A”。从中,我们发现:无论是 add() 、 remove() ,还是 clear() ,只要涉及到修改集合中的元素个数时,都会改变 modCount 的值。...

G11176593的博客 544

uni-app - 实现全屏自适应且不变形背景大图,设置一张图片占满全屏(根据手机或电脑尺寸自动拉伸背景图像),用于页面是一张平铺的大图做背景的情况,全端兼容

uni-app,vue.js,微信小程序-设置背景图自适应手机屏幕尺寸,页面中的背景图片高度和宽度自适应,UNI-APP里如何设置背景图自适应手机屏幕尺寸,如何实现一个图片铺满整个页面,并且可以根据用户机型进行自动修正,自适应背景大图片官方教程,一个页面如何将图像放到背景上,纯CSS实现,设置背景图片占满全屏,3种CSS实现背景图片全屏铺满自适应的方式,uni-app中如何让图片不带高度的自适应,兼容uni-app全端,支持【纯】微信小程序项目使用,uni-app-实现全屏自适应且不变形背景大图

🏆 前端领域优质创作者 1万+

YOLOv13|损失函数优化篇:Focal EIOU 保持良好性能的同时,提供更高效的计算和更稳定的训练过程-包源码

Focal IoU与EIoU:目标检测中的损失函数优化 摘要:本文深入探讨了目标检测中两种重要的边界框回归损失函数优化方法。Focal IoU借鉴Focal Loss思想,通过(1-IoU)^γ因子调节损失权重,使模型更关注难样本(低IoU预测框),有效解决了传统IoU Loss对难易样本权重相同的问题。EIoU则在CIoU基础上改进,通过简化长宽比计算、分离宽高损失项,提升了计算效率和训练稳定性。两种方法分别从样本权重分配和损失函数结构优化角度,显著提升了目标检测性能,为实际应用提供了更高效的解决方案。文

FJN110的博客 1864

Java集合中fail-fast和fail-safe机制详解

在使用集合时候,大家应该都遇到过或听过并发修改异常(ConcurrentModificationException),这其实是Java集合中的一种fail-fast机制,为了避免触发fail-fast机制,Java中还提供了一些采用fail-safe机制的集合类,本篇文章就系统的介绍一下这两种机制。

让~学习~成为一种习惯(橡 皮 人の技术博客) 1834

[SoC]SoC验证中bootcode与firmware相关验证经验总结

本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等

元直的博客 2497

java中的fail-fast(快速失败)机制

引入 在前面介绍ArrayList的扩容问题时对于modCount的操作没有详细说明,该变量的操作在add,remove等操作中都会发生改变。那么该变量到底有什么作用呢? 简介 fail-fast 机制,即快速失败机制,是java集合(Collection)中的一种错误检测机制。当在迭代集合的过程中该集合在结构上发生改变的时候,就有可能会发生fail-fast,即抛出ConcurrentMo

Howard的博客 4万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java中的Fail-Fast机制

Fail-Fast是一种编程思想,它强调在程序运行过程中,一旦检测到错误或异常情况,应立即抛出异常并终止操作,而不是继续执行可能引发更严重问题的代码。这种机制的核心思想是“早发现、早处理”,通过尽早暴露问题,避免错误在系统中扩散,从而简化调试和修复过程。在Java的集合框架中,Fail-Fast机制主要体现在对集合进行迭代时,如果在迭代过程中对集合进行了结构性修改(如添加、删除或修改元素),迭代器会立即抛出异常,而不是等到迭代结束后才发现问题。

weixin_74047328的博客 1356

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java中Fail - Fast与Fail - Safe机制

在 Java 集合框架中,Fail - Fast(快速失败)和 Fail - Safe(安全失败)是两种不同的迭代机制,用于处理集合在迭代过程中被修改的情况。

dsq_MaDing的博客 1156

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java中的Fail-Fast和Fail-Safe机制是什么?

Fail-Fast:快速发现并发修改问题,适用于单线程环境。实现简单,性能较高,但在多线程环境下可能抛出异常。Fail-Safe:避免因并发修改导致异常,适用于多线程环境。实现复杂,性能较低,但更适合高并发场景。根据具体的使用场景选择合适的机制,可以有效提高程序的健壮性和性能。一句话:Fail-Fast的目的是为了快速抛出错误让程序感知,而Fail-Safe的目的是程序进行容灾,避免因为异常导致程序停止。

weixin_45762066的博客 734

Java中的Fail-Fast机制详解

Fail-Fast机制是Java集合框架中一项重要的错误检测工具,通过抛出ConcurrentModificationException帮助开发者发现集合的非法修改。相比之下,Fail-Safe迭代器通过操作集合副本提供更高的容错性,适合多线程环境。理解这两种迭代器行为的差异,并根据应用场景选择合适的集合和修改策略,是编写健壮Java代码的关键。

持续输出Java相关知识 838

java fail-fast机制

fail-fast的解释 在系统设计中,快速失效是一种可以立即报告任何可能表明故障的机制。快速失效通常设计用于停止正常操作,而不是试图继续可能存在缺陷的过程。这样做的好处是可以预先识别出一些错误情况: 一方面可以避免执行复杂的其他代码; 另外一方面,这种异常情况被识别之后也可以针对性的做一些单独处理。 Java中的fail-fast机制,默认指的是Java集合的一种错误检测机制。当我们使用i...

赶路人儿 370

Java集合的快速失败机制 “fail-fast”?

Java集合的快速失败机制 “fail-fast”?

我从不打没有准备的仗! 9449

Java fail-fast机制

一、fail-fast机制是什么 多线程情况下,Iterator遍历集合时,其他程序对集合进行了操作(增删)。就会报错ConcurrentModificationException。 二、原理是什么 public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E...

qq_36890813的博客 277

Java - Java集合中的快速失败Fail Fast 机制

文章目录什么是 fail-fast 什么是 fail-fast fail-fast 机制是Java集合(Collection)中的一种错误机制。 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的结构进行了修改(增加、删除),则会抛出Concurrent Modification Exception 【并发修改异常】。 举个例子: 在多线程环境下,线程1正在对集合进行遍历,此时线程2对集合进行修改(增加、删除), 很容易抛出Concurrent Modification Exception 。 当

小工匠 2万+

java fail fast_java fail-fast机制

fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件(其实本质不是为了防止多线程修改,后面会讲到)。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生...

weixin_39603476的博客 151

java fail 方法_Java集合之fail-fast机制

1.1 fail-fast 机制简介fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-...

weixin_39989939的博客 179

Java 集合如何实现 Fail-Fast 与 Fail-Safe?迭代器机制详解

Java集合框架中的Fail-Fast和Fail-Safe机制是处理并发修改的两种不同策略。Fail-Fast机制在检测到并发修改时会立即抛出ConcurrentModificationException,以防止数据不一致,常见于ArrayList、HashSet等集合。Fail-Safe机制则通过创建集合的副本来避免并发修改导致的异常,适用于CopyOnWriteArrayList和ConcurrentHashMap等集合。Fail-Fast通过维护modCount字段来实现,而Fail-Safe则通过写

小健学Java的博客 1139
上一篇: Java 协变数组类型
下一篇: 浅析 Comparable 和 Comparator
ali48
博客等级 码龄6年 31粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值