快速失败(fail-fast)和安全失败(fail-safe)的区别

news2025/5/25 16:07:45

        在 Java 中,‌快速失败(Fail-Fast)‌和‌安全失败(Fail-Safe)‌是集合类(Collection)在迭代过程中处理并发修改的两种不同策略,二者的核心区别在于 ‌对并发修改的感知机制与容错性‌。


‌一、 快速失败(Fail-Fast)

  • 核心特性‌:
    一旦检测到集合在迭代过程中被修改(除通过迭代器自身的方法),立即抛出 ConcurrentModificationException,终止程序。

  • 实现原理‌:

    • 迭代器内部维护一个 modCount 计数器,记录集合的修改次数。
    • 每次迭代时检查 modCount 是否与初始值一致,若不一致,说明集合被修改,触发异常。
  • 适用场景‌:
    单线程环境,或明确确保不会在迭代时修改集合的场景。

  • 示例集合‌:
    ArrayListHashMapHashSet(非线程安全集合的默认行为)。

  • 代码演示‌:

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    list.remove(s); // 直接操作原集合:抛出 ConcurrentModificationException
}

‌二、安全失败(Fail-Safe)

  • 核心特性‌:
    允许在迭代过程中修改集合(如添加、删除元素),不会抛出异常。迭代器基于集合的‌副本‌或‌快照‌进行遍历,与原集合解耦。

  • 实现原理‌:

    • 迭代器操作的是集合的副本(如 CopyOnWriteArrayList 的写时复制技术)。
    • 或通过并发控制(如 ConcurrentHashMap 的分段锁机制)保证线程安全。
  • 适用场景‌:
    多线程环境,或需要在迭代过程中修改集合的场景。

  • 示例集合‌:
    CopyOnWriteArrayListConcurrentHashMapConcurrentLinkedQueue

  • 代码演示‌:

List<String> list = new CopyOnWriteArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    list.add("D"); // 直接操作原集合:不会抛出异常
}
System.out.println(list); // 输出 [A, B, C, D, D, D]

三、关键区别总结

特性快速失败(Fail-Fast)安全失败(Fail-Safe)
并发修改检测立即抛出异常,强制终止程序允许修改,不触发异常
迭代器数据源直接操作原集合基于集合的副本或快照
性能开销低(仅计数器检查)高(需维护副本或同步控制)
数据一致性强一致性(反映最新状态)弱一致性(可能遍历旧数据)
典型集合ArrayListHashMapCopyOnWriteArrayListConcurrentHashMap

四、选择建议

  • 若需 ‌强一致性‌ 且确定无并发修改 → ‌Fail-Fast‌。
  • 若需 ‌高并发支持‌ 或允许弱一致性 → ‌Fail-Safe‌。

  例如:

  • 单线程场景优先使用 ArrayList(Fail-Fast);
  • 多线程高并发场景选择 ConcurrentHashMap(Fail-Safe)。

五、Fail-Safe的使用场景

        Fail-Safe(安全失败)机制在多线程或动态修改集合的场景中尤为重要,以下是典型使用场景及示例:

(1)‌多线程并发操作

        当多个线程同时读写集合时,Fail-Safe集合(如 ConcurrentHashMap)可避免因并发修改导致的异常。
示例:

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("A", 1);
map.put("B", 2);

// 线程1:迭代
new Thread(() -> {
    Iterator<String> it = map.keySet().iterator();
    while (it.hasNext()) {
        System.out.println(it.next()); // 安全遍历
    }
}).start();

// 线程2:修改
new Thread(() -> {
    map.put("C", 3); // 不会触发异常
}).start();
(2)动态数据更新

        在需要实时更新数据的场景(如实时监控系统),CopyOnWriteArrayList 允许遍历时修改数据。

示例‌:

CopyOnWriteArrayList<String> logList = new CopyOnWriteArrayList<>();
logList.add("Log1");

// 遍历时追加日志
for (String log : logList) {
    System.out.println(log);
    logList.add("NewLog"); // 安全操作
}
‌(3)高吞吐量系统

        如消息队列消费者处理数据时,Fail-Safe集合可避免因频繁修改导致的迭代中断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2385447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟环境中的PyQt5 Pycharm设置参考

假如虚拟环境名是p3939 里面安装了pyqt5相关的库 1.QtDesigner Qt Designer 是通过拖拽的方式放置控件&#xff0c;并实时查看控件效果进行快速UI设计 位置 内容 name 可以随便命名&#xff0c;只要便于记忆就可以&#xff0c;本次采取通用…

AUTOSAR图解==>AUTOSAR_SRS_LIN

AUTOSAR LIN模块分析 目录 LIN模块概述LIN模块架构LIN通信状态流程LIN通信序列LIN配置结构总结1. LIN模块概述 本文档基于AUTOSAR规范SRS_LIN文档,对LIN(Local Interconnect Network)相关模块进行详细分析。主要包括以下几个模块: LIN接口 (LinIf)LIN驱动 (Lin)LIN传输层…

华为昇腾使用ollama本地部署DeepSeek大模型

文章目录 前言一、本次使用的硬件资源二、Ollama介绍三、Ollama在arm64位的芯片的安装及使用方法总结 前言 本次打算在华为昇腾上面使用ollama进行部署DeepSeek大模型。 一、本次使用的硬件资源 存储资源 内存资源 cpu资源 二、Ollama介绍 Ollama 是一个开源的大型语言…

多态的总结

什么是多态&#xff1f; 答&#xff1a;多态是多种形态&#xff0c;是为了完成某种行为时&#xff0c;不同对象会产生不同的形态&#xff08;结合车票例子解释&#xff09; 2. 什么是重载、重写(覆盖)、重定义(隐藏)&#xff1f; 答&#xff1a;重载的条件是&#xff1a;在同一…

Windows 高分辨率屏幕适配指南:解决界面过小、模糊错位问题

&#x1f5a5;️ Windows 高分辨率屏幕适配指南&#xff1a;解决界面过小、模糊错位问题 摘要&#xff1a; 在使用高分辨率屏幕时&#xff0c;许多老旧的桌面软件会出现界面显示异常的问题&#xff0c;例如窗口过小、控件错位、文字模糊等。本文提供一套通用解决方案&#xff0…

K8S-statefulset-mysql-ha

需求 实现一个HA mysql&#xff0c;包括1个master&#xff0c;2个slave。在K8S上已statefulset部署。 mysql HA原理 略 K8S环境需要解决的问题 1、由于使用同一个statefulset配置&#xff0c;因此需要考虑master和slave使用不同的cnf文件。 2、不同pod之间文件的传输 3、…

【方案分享】展厅智能讲解:基于BLE蓝牙Beacon的自动讲解触发技术实现

【方案分享】展厅智能讲解&#xff1a;基于BLE蓝牙Beacon的自动讲解触发技术实现 让观众靠近展品即可自动弹出讲解页面&#xff0c;是智能展厅的核心功能之一。本文将从软硬件技术、BLE Beacon原理、微信小程序实现、优劣对比与拓展方案五个维度&#xff0c;系统讲解“靠近展台…

web常见的攻击方式有哪些?如何防御?

Web常见攻击方式及防御策略 SQL注入 (SQL Injection) 详细解析: SQL 注入是一种利用应用程序未正确验证用户输入的漏洞&#xff0c;通过向应用传递恶意 SQL 查询来操纵数据库的行为。这种攻击可能导致敏感数据泄露、篡改或删除。 步骤: 攻击者找到可接受动态参数的应用程序…

力扣:《螺旋矩阵》系列题目

今天做了一下螺旋矩阵主题的一系列题目 即力扣中的相似题目 还是有所感悟的 接下来一一回顾&#xff1a; 第一题&#xff1a; 59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 这题让我们生成一个正方形的矩阵&#xff0c;注意是正方形&#xff0c;不是长方形&a…

发电厂进阶,modbus TCP转ethernet ip网关如何赋能能源行业

案例分享&#xff1a;稳联技术modbus TCP转ethernet ip网关wl-abc004赋能&#xff0c;发电厂自动化改造&#xff0c;推动能源行业智能化升级 随着全球能源结构转型和“双碳”目标的推进&#xff0c;传统发电厂&#xff08;如火电、水电、生物质发电&#xff09;正面临严峻挑战&…

深入了解linux系统—— 操作系统的路径缓冲与链接机制

前言 在之前学习当中&#xff0c;我们了解了被打开的文件是如何管理的&#xff1b;磁盘&#xff0c;以及ext2文件系统是如何存储文件的。 那我们要打开一个文件&#xff0c;首先要先找到这个文件&#xff0c;操作系统又是如何去查找的呢&#xff1f; 理解操作系统搜索文件 …

华为2025年校招笔试真题手撕教程(一)

一、题目 输入&#xff1a; 第一行为记录的版本迭代关系个数N&#xff0c;范围是[1&#xff0c;100000]; 第二行到第N1行&#xff1a;每行包含两个字符串&#xff0c;第一个字符串为当前版本&#xff0c;第二个字符串为前序版本&#xff0c;用空格隔开。字符串包含字符个数为…

第9.2讲、Tiny Decoder(带 Mask)详解与实战

自己搭建一个 Tiny Decoder&#xff08;带 Mask&#xff09;&#xff0c;参考 Transformer Encoder 的结构&#xff0c;并添加 Masked Multi-Head Self-Attention&#xff0c;它是 Decoder 的核心特征之一。 1. 背景与动机 Transformer 架构已成为自然语言处理&#xff08;NLP…

基于PCRLB的CMIMO雷达网络多目标跟踪资源调度

针对分布式组网CMIMO雷达多目标跟踪(MTT)场景&#xff0c;博客分析了一种目标-雷达匹配方案与功率联合优化算法。在采用分布式组网融合架构的基础上&#xff0c;推导包含波束和功率分配的后验克拉美罗界(PCRLB)。随后&#xff0c;将该效用函数结合CMIMO雷达系统资源&#xff0c…

AtCoder Beginner Contest 407(ABCDE)

A - Approximation 翻译&#xff1a; 给你一个正整数 A 和一个正奇数 B。 请输出与实数 的差最小的整数。 可以证明&#xff0c;在约束条件下&#xff0c;这样的整数是唯一的。 思路&#xff1a; 令。比较来判断答案。 实现&#xff1a; #include<bits/…

VILT模型阅读笔记

代码地址&#xff1a;VILT Abstract Vision-and-Language Pre-training (VLP) has improved performance on various joint vision-andlanguage downstream tasks. Current approaches to VLP heavily rely on image feature extraction processes, most of which involve re…

掌握 npm 核心操作:从安装到管理依赖的完整指南

图为开发者正在终端操作npm命令&#xff0c;图片来源&#xff1a;Unsplash 作为 Node.js 生态的基石&#xff0c;npm&#xff08;Node Package Manager&#xff09;是每位开发者必须精通的工具。每天有超过 1700 万个项目通过 npm 共享代码&#xff0c;其重要性不言而喻。本文…

OpenCV CUDA模块特征检测与描述------一种基于快速特征点检测和旋转不变的二进制描述符类cv::cuda::ORB

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::ORB 是 OpenCV 库中 CUDA 模块的一部分&#xff0c;它提供了一种基于快速特征点检测和旋转不变的二进制描述符的方法&#xff0c;用于…

Awesome ChatGPT Prompts:释放AI对话潜力的开源利器

项目概览 Awesome ChatGPT Prompts 是由土耳其开发者 Fatih Kadir Akın 发起的开源项目,托管于 GitHub,旨在通过精心设计的提示词模板(Prompts)优化用户与 ChatGPT 的交互体验。项目以 Markdown 和 CSV 格式管理模板,无需复杂编程语言,但需文本处理能力,目前已在 GitH…

PP-YOLOE-SOD学习笔记2

一、解析X-Anylabeling标注后的json格式问题 最近在使用自动标注工具后json格式转化过程中&#xff0c;即标注框的四点坐标转换为两点坐标时&#xff0c;发现json格式的四点顺序是按顺时针方向开始的&#xff0c;那么在转换其实就是删除2、4坐标或者1、3坐标即可。 二、数据集…