Java的fail-fast机制究竟是什么?

baskbull
• 阅读 1653

fail-fast机制

快速失败模块的职责是检测错误,然后让系统的下一个最高级别处理错误。一旦发生异常, 直接停止并上报。尽最大努力去抛出异常。

这样做的好处是可以预先识别出一些错误情况,但是它同样也可能会为我们带来一些问题。

集合类的fail-fast机制

当多个线程对部分集合进行结构上的改变操作,有可能会产生fail-fast机制,这时候会抛出ConcurrentModificationException

使用增强for循环尝试删除集合中的元素会报这个异常

我们对class进行反编译,可以发现foreach其实是依赖了while循环和Iterator实现的

真正报错的原因是checkForComodification方法

它会检查modCount和expectedModCount的值是否相等。

modCount是ArrayList中的一个成员变量。它表示集合实际被修改的次数

expectedModCount是ArrayList的一个内部类Itr的成员变量 HashMap HashMapSpliterator的成员变量

然后使用remove方法 只会对modCount进行修改,所以在下一次next的时候就会报错

fail-fast 的主要目的就是识别并发,然后通过异常的方式通知用户

fail-safe机制

java.util.concurrent 包下的容器都是 fail-safe 的,可以在多线程下并发使用,并发 修改。同时也可以在 foreach 中进行 add/remove 。

fail-safe 集合的所有对集合的修改都是先拷贝一份副本,然后在副本集合上进行的, 并不是直接对原集合进行修改。并且这些修改方法,如 add/remove 都是通过加锁来控制并发的。

迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

Copy-On-Write 简称 COW,是一种用于程序设计中的优化策略。其基本思路是, 从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容 Copy 出去形成一个新的内容然后再改,这是一种延时懒惰策略。

CopyOnWrite 容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时 候,不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个新的容器,然后新 的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。

它的add/remove方法是需要加锁的,为了避免copy出n个副本出来,导致并发写

但是它的读方法是没有加锁的,这样做的好处是我们可以对 CopyOnWrite 容器进行并发的读,当然,这里读到的数据可能不是最新的。因为写时复制的思想是通过延时更新的策略来实现数据的最终一致性的,并非强一致性。

CopyOnWrite 并发容器用于读多写少的并发场景。比如白名单,黑名单,商品类目的 访问和更新场景。

本次文章的内容就到这里~

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
3年前
前端 - 常见的异常捕获方法
前端异常捕获在ES3之前js代码执行的过程中,一旦出现错误,整个js代码都会停止执行,这样就显的代码非常的不健壮。从ES3开始,js也提供了类似的异常处理机制,从而让js代码变的更健壮,程序执行的过程中出现了异常,也可以让程序具有了一部分的异常恢复能力。js异常的特点是,出现不会导致JS引擎崩溃,最多只会终止当前执行的任务。回归正题,我们该如何在程序异常发生
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java异常处理
_1.异常的分类_Error:称为错误,有java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。Exception:所以异常类的父类,其子类对应了各种各样可能出现的异常,一般需要用户显示的声明或捕获。RuntimeException:一类特殊的异常,如被0除,数组下标超范围等,其产生比较频繁,处理比较麻烦,如果显示
Easter79 Easter79
3年前
SpringMVC源码(五)
SpringMVC除了对请求URL的路由处理特别方便外,还支持对异常的统一处理机制,可以对业务操作时抛出的异常,unchecked异常以及状态码的异常进行统一处理。SpringMVC既提供简单的配置类,也提供了细粒度的异常控制机制。SpringMVC中所有的异常处理通过接口HandlerExceptionResolver来实现,接口中只定义了一个方法
Wesley13 Wesley13
3年前
Java入门之异常处理
1.异常概念异常指的是程序在执行过程中出现的非正常的情况,导致JVM的非正常停止。在Java中,异常是一个类,产生异常就是创建异常对象并抛出一个异常对象。异常指的并不是语法错误,语法错误,编译不会通过,而是编译通过后,程序执行异常。异常的作用是帮助我们找到程序中的问题。2.异常产生过程解析pub
Wesley13 Wesley13
3年前
Java异常架构
Java异常简介Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what,where,why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息
小万哥 小万哥
1年前
C++异常和错误处理机制:如何使您的程序更加稳定和可靠
在C编程中,异常处理和错误处理机制是非常重要的。它们可以帮助程序员有效地处理运行时错误和异常情况。本文将介绍C中的异常处理和错误处理机制。什么是异常处理?异常处理是指在程序执行过程中发生异常或错误时,程序能够捕获并处理这些异常或错误的机制。例如,当
小万哥 小万哥
7个月前
Java 异常处理与正则表达式详解,实例演练及最佳实践
Java异常Try...Catch在Java代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。当错误发生时,Java通常会停止并生成错误消息,这个过程称为抛出异常。try...catch语句try语句允许您定义一段代
小万哥 小万哥
6个月前
C++ 异常处理机制详解:轻松掌握异常处理技巧
C异常处理C异常处理机制允许程序在运行时处理错误或意外情况。它提供了捕获和处理错误的一种结构化方式,使程序更加健壮和可靠。异常处理的基本概念:异常:程序在运行时发生的错误或意外情况。抛出异常:使用throw关键字将异常传递给调用堆栈。捕获异常:使用
小白学大数据 小白学大数据
3个月前
错误处理在网络爬虫开发中的重要性:Perl示例 引言
错误处理的必要性在网络爬虫的开发过程中,可能会遇到多种错误,包括但不限于:网络连接问题服务器错误(如404或500错误)目标网站结构变化超时问题权限问题错误处理机制可以确保在遇到这些问题时,爬虫能够优雅地处理异常情况,记录错误信息,并在可能的情况下恢复执行
baskbull
baskbull
Lv1
热爱,是梦想的起点
文章
2
粉丝
0
获赞
1