当前位置: 首页 > news >正文

面试题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&#xff0c;是多线程并发操作集合时的一种失败处理机制。 1.1.Fail-Safe机制 1.1.1.定义 Fail-Safe 机制的设计目标是在发生故障时&#xff0c;系统仍然能够继续运行&#xff0c;尽量避免导致整个系统崩溃。即使发生错误或异常&#xff0c;系统…...

C/C++复习(一)

1.sizeof 关于sizeof我们是经常使用的&#xff0c;所以使用方法就不需要提及了&#xff0c;这里我们需要注意的是&#xff0c;sizeof 后面如果是表达式可以不用括号&#xff0c;并且sizeof实际上不参与运算&#xff0c;返回的是内容的类型大小&#xff08;size_t类型&#xff0…...

iOS Object-C 将数组倒置(倒叙)

使用NSArray自带的对象方法:reverseObjectEnumerator 代码如下: NSArray * tempArray [[NSArray alloc]initWithObjects:"a","b","c","d", nil]; //将tempArray转换成["d","c","b","a"]; …...

动态轻量级线程池项目

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

【AI知识点】批归一化(Batch Normalization)

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

【低代码】前端低代码开发日记2:遇到的问题(1)双向绑定

在前期的快速迭代阶段&#xff0c;虽然界面有些杂乱&#xff0c;但整体功能尚能凑合运行。真正让人头疼的&#xff0c;还是接下来几个关键功能的实现。 遇到的问题 双向绑定 在Vue中&#xff0c;v-model提供了方便的双向绑定功能&#xff0c;它是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 语言中的错误和异常&#xff1a;设计理念与优势 在软件开发中&#xff0c;错误处理是一个至关重要的环节。不同的编程语言对于错误和异常的处理方式各有不同。Go 语言将错误和异常进行了明确区分&#xff0c;这种设计理念带来了许多独特的优势。本文将深入探讨 Go 语言中错误…...

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…...

IDEA下“File is read-only”可能原因及“找不到或无法加载主类”问题的解决

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

MySQL【知识改变命运】03

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

【测试】BUG篇——BUG

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

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01; 本章是高阶数据结构笔记的第一篇文章&#xff0c;将分享二叉搜索树的进阶概念及其高效实现的相关知识&#xff0c;欢迎大家阅读&#xff01; &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f3…...

上传本地项目到GitHub远程仓库(极简洁操作版)

第一步&#xff1a;在GitHub创建一个空的仓库 第二步&#xff1a;将仓库克隆&#xff08;下载&#xff09;到本地 第三步&#xff1a;将你要上传的所有文件放到这个克隆的仓库文件夹中 第四步&#xff1a;通过git add .将待上传文件添加到暂存区 此时&#xff0c;可以通过git …...

在安卓中使用 `mobile-ffmpeg` 压缩后的视频,浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案

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

C语言指针plus版练习

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

Kafka 快速入门

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

探索人们最喜爱的AI工具及其应用影响

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

c语言位域详解

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

如何修改Spring Boot内置容器默认端口

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

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...