面试题1-fail-safe机制与fail-fast 机制
1.定义
Fail-safe 和 Fail-fast,是多线程并发操作集合时的一种失败处理机制。
1.1.Fail-Safe机制
1.1.1.定义
Fail-Safe 机制的设计目标是在发生故障时,系统仍然能够继续运行,尽量避免导致整个系统崩溃。即使发生错误或异常,系统会进入一种安全的状态,确保功能的部分可用性或避免更严重的后果。
Fail-safe,表示失败安全,也就是在这种机制下,出现集合元素的修改,不会抛出 ConcurrentModificationException。
原因是采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容, 在拷贝的集合上进行遍历。由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所做的修改并不能被迭代器检测到,java定义了一个 CopyOnWriteArrayList,在对这个集合遍历过程中,对集合元素做修改后,不会抛出异常,但同时也不会打印出增加的元素。
java.util.concurrent 包下的容器都是安全失败的,可以在多线程下并发使用,并发修改。
常见的使用 fail-safe 方式遍历的容器有 ConcerrentHashMap 和 CopyOnWriteArrayList 等
private static void failSafe() { CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<Integer>(new Integer[] {1,2,3,4}); Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()) { Integer i = iterator.next(); System.out.println(i); if(i == 3) { list.add(108); // 在fail-salf模式下,这里不会被打印 } } } |
1.1.2.作用
容错性强:Fail-Safe 机制会捕获错误并采取补救措施,系统不会立即中止或崩溃。例如,它可能通过回滚、降级、冗余处理等方式维持基本的功能。
保证安全:它倾向于在发生故障时确保安全性或系统的核心功能。即使某个组件出错,系统会将其隔离或使用默认值来继续运行,而不会产生灾难性的影响。
延续运行:系统能继续执行,保持尽可能正常的操作,用户可能会感知到降级的服务或性能,但不会完全丧失功能。
1.1.3.典型应用场景
核电站控制系统:如果某个传感器失效,系统会进入安全模式,防止发生危险。
飞行控制系统:如果某个子系统出问题,系统会通过冗余设计或故障切换继续飞行。
数据库事务处理:在分布式系统中,Fail-Safe 机制可能用于保持数据的一致性,即使某些服务不可用,系统仍可以部分运行。
1.1.4.优缺点
优点:提高系统的可靠性,防止单点故障影响整个系统。
缺点:可能隐藏潜在的问题,长时间运行会积累更多隐患,影响后续的维护和修复。
1.2.Fail-Fast机制
1.2.1.定义
Fail-Fast 机制的设计目标是在系统检测到故障时,立即终止运行并报告错误,避免故障传播或进一步引发不可控的后果。系统在发现问题时不做任何掩饰,而是迅速失败,让问题暴露在早期阶段。
例如,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出 ConcurrentModificationException 异常,从而导致遍历失败。定义一个 Map 集合,使用 Iterator 迭代器进行数据遍历,在遍历过程中,对集合数据做变更时,就会 发生 fail-fast。
java.util 包下的集合类都是快速失败机制的, 常见的使用 fail-fast 方式遍历的容器有 HashMap 和 ArrayList 等。
private void failFast() { Map<String, String> names = new HashMap<String, String>(); names.put("001", "name001"); names.put("002", "name002"); names.put("003", "name003"); names.put("004", "name004"); names.put("005", "name005");
Iterator<String> iterator = names.keySet().iterator(); while(iterator.hasNext()) { System.out.println(names.get(iterator.next())); names.put("006", "name006"); } } |
1.2.2.作用
快速检测错误:Fail-Fast 机制允许系统在检测到不正常情况时立即失败,从而尽早暴露问题。这使得开发人员或运维人员能够迅速发现并修复问题,防止其在系统中蔓延。
避免错误扩散:Fail-Fast 机制通过立即中止故障进程,防止问题影响其他模块或功能,从而保护系统整体的稳定性。
提高开发质量:Fail-Fast 的策略常用于开发和测试环境中,以确保系统在最早的阶段检测到潜在的缺陷和问题。
1.2.3.典型应用场景
Java 集合框架:如ArrayList
中的迭代器就是 Fail-Fast 的。如果在遍历过程中发现集合结构被修改,它会立即抛出ConcurrentModificationException
,而不是继续运行可能导致不一致的状态。
敏捷开发:在持续集成和持续交付的环境中,Fail-Fast 机制用于在代码中发现问题时立即中断构建,防止有缺陷的代码被部署。
微服务架构:当一个服务依赖的其他服务发生错误时,Fail-Fast 机制可以让服务立即返回错误,而不是等待超时,避免造成更多资源浪费。
1.2.4.优缺点
优点:加快问题的暴露和反馈,防止问题积累,有助于提高系统的整体质量。
缺点:可能在系统中引发较多的短暂性失败,尤其是在分布式系统中,网络抖动或短暂的依赖故障也会导致系统快速终止。
2.Fail-Safe和Fail-Fast的对比
Fail-Safe 机制适用于需要高容错性的系统,目标是在故障情况下仍能保持系统的部分功能运行,保障系统安全性。
Fail-Fast 机制用于尽早暴露和处理错误,防止问题蔓延,适合对问题快速反馈和修复的场景。
相关文章:

面试题1-fail-safe机制与fail-fast 机制
1.定义 Fail-safe 和 Fail-fast,是多线程并发操作集合时的一种失败处理机制。 1.1.Fail-Safe机制 1.1.1.定义 Fail-Safe 机制的设计目标是在发生故障时,系统仍然能够继续运行,尽量避免导致整个系统崩溃。即使发生错误或异常,系统…...

C/C++复习(一)
1.sizeof 关于sizeof我们是经常使用的,所以使用方法就不需要提及了,这里我们需要注意的是,sizeof 后面如果是表达式可以不用括号,并且sizeof实际上不参与运算,返回的是内容的类型大小(size_t类型࿰…...

iOS Object-C 将数组倒置(倒叙)
使用NSArray自带的对象方法:reverseObjectEnumerator 代码如下: NSArray * tempArray [[NSArray alloc]initWithObjects:"a","b","c","d", nil]; //将tempArray转换成["d","c","b","a"]; …...

动态轻量级线程池项目
动态线程池: 使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢? ① 代码中创建了一个ThreadPoolExecutor,但是不知道参数设置多少比较合适。 ② 凭经验设置参数值,上线后发现需要调整,改代码重新发布服务&…...

【AI知识点】批归一化(Batch Normalization)
更多AI知识点总结见我的专栏:【AI知识点】 AI论文精读、项目和一些个人思考见我另一专栏:【AI修炼之路】 有什么问题、批评和建议都非常欢迎交流,三人行必有我师焉😁 批归一化(Batch Normalization,BN&…...

【低代码】前端低代码开发日记2:遇到的问题(1)双向绑定
在前期的快速迭代阶段,虽然界面有些杂乱,但整体功能尚能凑合运行。真正让人头疼的,还是接下来几个关键功能的实现。 遇到的问题 双向绑定 在Vue中,v-model提供了方便的双向绑定功能,它是modelValue属性和onUpdate:m…...

10.9作业
1、鼠标和键盘事件 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QMouseEvent>widget::widget(QWidget *parent): QWidget(parent), ui(new Ui::widget) {ui->setupUi(this);this->setWindowFlag(Qt::Fram…...

Go 语言中的错误和异常:设计理念与优势
Go 语言中的错误和异常:设计理念与优势 在软件开发中,错误处理是一个至关重要的环节。不同的编程语言对于错误和异常的处理方式各有不同。Go 语言将错误和异常进行了明确区分,这种设计理念带来了许多独特的优势。本文将深入探讨 Go 语言中错误…...

sqli-labs less-20 less-21 less-22 cookie注入
COOKIE 作用:是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络行为有关,记录了当前用户的状态 形式:keyvalue 例如:当我们登录某个账号后,服务器会在cookies进行记录 个人理解…...

IDEA下“File is read-only”可能原因及“找不到或无法加载主类”问题的解决
1.File is read-only”可能原因 写代码时想要修改这个静态变量的值,把这个语句注释掉,发现在这个文件中File is read-only无法编辑修改,于是想去掉这个状态 网上查看的解释大多是在File栏目或File->File Properties下可以找到Make File W…...

MySQL【知识改变命运】03
表的基本操作 1:查看所有表2:创建表3:查看表结构4:修改表5: 删除表 前言:我们先了解一个知识: MySQL安装后会有MySQL服务——管理多个库——每个库管理多个表——每个表管理多行数据——数据行由…...

【测试】BUG篇——BUG
bug的概念 定义:⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault),这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说: 当且仅当规格说明&am…...

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油! 本章是高阶数据结构笔记的第一篇文章,将分享二叉搜索树的进阶概念及其高效实现的相关知识,欢迎大家阅读! 🌈个人主页:是店小二呀 dz…...

上传本地项目到GitHub远程仓库(极简洁操作版)
第一步:在GitHub创建一个空的仓库 第二步:将仓库克隆(下载)到本地 第三步:将你要上传的所有文件放到这个克隆的仓库文件夹中 第四步:通过git add .将待上传文件添加到暂存区 此时,可以通过git …...

在安卓中使用 `mobile-ffmpeg` 压缩后的视频,浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案
在安卓中使用 mobile-ffmpeg 压缩后的视频,浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案 你可能在安卓开发中使用了 mobile-ffmpeg 进行视频压缩,而当你尝试在浏览器中在线播放压缩后的视频时,看到提示:…...

C语言指针plus版练习
上期我们讲了进阶的指针,本期内容我们来强化一下上期学的内容 一、字符串左旋 实现一个函数,可以左旋字符串中的k个字符。 1.1 分析题目 假设字符串为abcde,左旋一个以后就变成bcdea,就是把第一个字符移到一个新的变量里面&#…...

Kafka 快速入门
目录 介绍 KafKa 相关术语 编辑 Kafka的工作流程 生产者向kafka发送数据的流程 Kafka选择分区的模式 Kafka选择分区的模式 数据消费 kafka的文件存储机制 topic、partition和segment 存储和查找message的过程 数据写入过程 数据查找过程 注意事项 kafka管理UI …...

探索人们最喜爱的AI工具及其应用影响
探索人们最喜爱的AI工具及其应用影响 在科技飞速发展的时代,人工智能(AI)技术正在改变我们的生活和工作方式。越来越多的人开始使用AI工具来提高效率、简化流程和推动创新。那么,在众多的AI工具中,哪些是人们最喜欢的…...

c语言位域详解
一、什么是位域 位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式,而不像普通的整型变量那样固定使用系统规定的字节大小。 通过位域,我们可以在一个整型数据中指定具体的位数来表示某些信息。比…...

如何修改Spring Boot内置容器默认端口
默认情况下,Spring Boot 应用程序在嵌入式 Tomcat 服务器上启动,并监听默认端口 8080。如果您需要将默认的嵌入式服务器端口更改为其他端口号,可以使用以下几种方法之一: 嵌入式服务器配置命令行参数属性文件 在代码里以编程方式…...

STM32自动下载电路分享及注意事项
文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中,使用STM32下载程序,可以通过仿真器下载,也可以通过串口下载。在stm32串口下载时,我们需要手动配置启…...

【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。
【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 文章目录 【深度学习基础模型】极限学习机&a…...

把交换机的两个接口连接起来会怎么样?
当把交换机的两个接口连接起来时,可能会产生网络风暴,具体情况如下: 一、形成环路的过程 如果将交换机的两个端口直接连接,就会在网络中形成一个物理环路。例如,假设交换机有端口 A 和端口 B,用一根网线将…...

无人机陆空双模式。
🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…...

14. 文档对象模型
打开网页时,浏览器会检索网页的 HTML 文本并对其进行解析,就像第 12 章中的解析器解析程序一样。浏览器会建立一个文档结构模型,并使用该模型在屏幕上绘制页面。这种文档表示法是 JavaScript 程序在沙盒中的玩具之一。它是一种可以读取或修改…...

【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法
去光荣地受伤, 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…...

yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】
yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察,仅仅通过这…...

k8s部署安装
k8s部署安装 一 K8s集群环境搭建1.1 k8s中容器的管理方式1.2 k8s集群部署1.2.1 k8s环境部署说明1.2.2 k8s集群环境初始化1.2.2.1 所有节点禁用swap和本地解析1.2.2.2 所有节点安装docker1.2.2.3.所有节点设定docker的资源管理模式为systemd1.2.2.4.所有阶段复制harbor仓库中的证…...

gpt为什么可以依据上下文来回答问题,依据的是什么原理
GPT 可以依据上下文回答问题,主要依据以下几个原理: Transformer 架构: 并行计算与长距离依赖处理:Transformer 架构摒弃了传统的递归神经网络和长短时记忆网络的序列依赖处理方式,具有并行计算的能力。它可以同时处理…...

2023 CCPC哈尔滨 报告
比赛链接:Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforceshttps://codeforces.com/group/w6iGs8kreW/contest/552949 做题数:3 题 三题都是队友写的。所以来补一下 B L J。 B题: B. Memory Little G used to be a participant …...