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

baskbull
• 阅读 1476

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 ✨
2年前
前端 - 常见的异常捕获方法
前端异常捕获在ES3之前js代码执行的过程中,一旦出现错误,整个js代码都会停止执行,这样就显的代码非常的不健壮。从ES3开始,js也提供了类似的异常处理机制,从而让js代码变的更健壮,程序执行的过程中出现了异常,也可以让程序具有了一部分的异常恢复能力。js异常的特点是,出现不会导致JS引擎崩溃,最多只会终止当前执行的任务。回归正题,我们该如何在程序异常发生
kenx kenx
2年前
SpringBoot优雅的全局异常处理
前言在日常项目开发中,异常是常见的,但是如何更高效的处理好异常信息,让我们能快速定位到BUG,是很重要的,不仅能够提高我们的开发效率,还能让你代码看上去更舒服,SpringBoot的项目已经有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot默认的错误处理机制返回错误页面默认返回W
Wesley13 Wesley13
2年前
java异常处理
_1.异常的分类_Error:称为错误,有java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。Exception:所以异常类的父类,其子类对应了各种各样可能出现的异常,一般需要用户显示的声明或捕获。RuntimeException:一类特殊的异常,如被0除,数组下标超范围等,其产生比较频繁,处理比较麻烦,如果显示
Easter79 Easter79
2年前
SpringMVC源码(五)
SpringMVC除了对请求URL的路由处理特别方便外,还支持对异常的统一处理机制,可以对业务操作时抛出的异常,unchecked异常以及状态码的异常进行统一处理。SpringMVC既提供简单的配置类,也提供了细粒度的异常控制机制。SpringMVC中所有的异常处理通过接口HandlerExceptionResolver来实现,接口中只定义了一个方法
Stella981 Stella981
2年前
Spring Boot 与 Kotlin Web应用的统一异常处理
做Web应用,请求处理过程中发生错误是非常常见的。SpringBoot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。选择一个之前实现过的Web应用(chapter1151)为基础,启动该应用,访问一个不存在的URL,或是修改处理内容,直接抛出异常,如:
Wesley13 Wesley13
2年前
JAVA运行时异常及常见的5中RuntimeExecption
java运行时异常是可能在java虚拟机正常工作时抛出的异常。java提供了两种异常机制。一种是运行时异常(RuntimeExepction),一种是检查式异常(checkedexecption)。检查式异常:我们经常遇到的IO异常及sql异常就属于检查式异常。对于这种异常,java编译器要求我们必须对出现的这些异常进行catch所以面对这种异
Wesley13 Wesley13
2年前
Java入门之异常处理
1.异常概念异常指的是程序在执行过程中出现的非正常的情况,导致JVM的非正常停止。在Java中,异常是一个类,产生异常就是创建异常对象并抛出一个异常对象。异常指的并不是语法错误,语法错误,编译不会通过,而是编译通过后,程序执行异常。异常的作用是帮助我们找到程序中的问题。2.异常产生过程解析pub
Wesley13 Wesley13
2年前
Java异常架构
Java异常简介Java异常是Java提供的一种识别及响应错误的一致性机制。Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what,where,why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息
小万哥 小万哥
10个月前
C++异常和错误处理机制:如何使您的程序更加稳定和可靠
在C编程中,异常处理和错误处理机制是非常重要的。它们可以帮助程序员有效地处理运行时错误和异常情况。本文将介绍C中的异常处理和错误处理机制。什么是异常处理?异常处理是指在程序执行过程中发生异常或错误时,程序能够捕获并处理这些异常或错误的机制。例如,当
小万哥 小万哥
2星期前
Java 异常处理与正则表达式详解,实例演练及最佳实践
Java异常Try...Catch在Java代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。当错误发生时,Java通常会停止并生成错误消息,这个过程称为抛出异常。try...catch语句try语句允许您定义一段代
baskbull
baskbull
Lv1
热爱,是梦想的起点
文章
2
粉丝
0
获赞
1