代码编织梦想

01 fail-safe和fail-fast

fail-safe和fail-fast ,是多线程并发操作集合时的一种失败处理机制。


02 Fail-fast (快速失败)

 在集合遍历中,一旦发现容器中数据被修改了,立刻抛出ConcurrentModificationException,从而导致遍历失败

java.util包下的集合类都是快速失败机制的, 常见的的使用fail-fast方式遍历的容器有HashMap和ArrayList等

public static void main(String[] args) {
    Map<String,String> map = new HashMap<>();
    map.put("11", "22");
    map.put("33", "44");
    Iterator<String> iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        System.out.println(map.get(iterator.next()));
        map.put("55", "66");
    }
}

输出

22
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
	at java.util.HashMap$KeyIterator.next(HashMap.java:1466)
	at com.test.Test.main(Test.java:28)

03 Fail-safe(失败安全)

 集合元素修改,不会抛出异常

,原因是采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,
在拷贝的集合上进行遍历。由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到

比如这种情况(贴下面这个图) , 定义了一个CopyOnWriteArrayList,在对这个集合遍历过程中,对集合元素做修改后,不会抛出异常,但同时也不会打印出增加的元素。

java.util.concurrent包下的容器都是安全失败的,可以在多线程下并发使用,并发修改。

常见的的使用fail-safe方式遍历的容器有ConcerrentHashMap和CopyOnWriteArrayList等

public static void main(String[] args) throws InterruptedException {
    CopyOnWriteArrayList<Integer> copyOnWriteArrayList = new CopyOnWriteArrayList();
    copyOnWriteArrayList.add(1);
    copyOnWriteArrayList.add(2);
    copyOnWriteArrayList.add(3);
    Iterator<Integer> iterator = copyOnWriteArrayList.iterator();
    while (iterator.hasNext()) {
        Integer next = iterator.next();
        System.out.println(next);
        // 这个地方不会抛异常
        copyOnWriteArrayList.add(4);
    }

    Thread.sleep(1000);
    System.out.println("----------------");
    // 这里打印出来的还是旧的集合
    while (iterator.hasNext()) {
        Integer next = iterator.next();
        System.out.println(next);
    }

    Thread.sleep(1000);
    System.out.println("----------------");
    // 这里打印出来的是新的集合
    Iterator<Integer> iterator1 = copyOnWriteArrayList.iterator();
    while (iterator1.hasNext()) {
        Integer next = iterator1.next();
        System.out.println(next);

    }
}

输出
1
2
3


1
2
3
4
4
4

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37335180/article/details/129668828

java中fail-fast 和 fail-safe的区别-爱代码爱编程

原文地址:http://javahungry.blogspot.com/2014/04/fail-fast-iterator-vs-fail-safe-iterator-difference-with-example-in-java.html 在我们详细讨论这两种机制的区别之前,首先得先了解并发修改。 1.什么是同步修改? 当一个或多个线程正在遍历一

java集合篇:fail-fast机制 与 fail-safe_张维鹏的博客-爱代码爱编程

在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList: 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序

fail-fast和fail-safe的区别-爱代码爱编程

一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的

fail-fast和fail-safe_攀子zzu的博客-爱代码爱编程

我们都接触 HashMap、ArrayList 这些集合类,这些在 java.util 包的集合类就都是快速失败的; 而  java.util.concurrent 包下的类都是安全失败,比如:ConcurrentHashMap。   在使用迭代器对集合对象进行遍历的时候,如果 A 线程正在对集合进行遍历,此时 B 线程对集合进行修改(增加、删除、修

fail-fast机制和fail-safe机制的介绍和区别-爱代码爱编程

fail-fast机制并不是Java集合特有的机制,fail-fast是一种错误检测机制,一旦检测到可能发生错误,就立马抛出异常,程序不继续往下执行 【Fail-fast】In systems design, a f

关于快速失败(fail-fast)和安全失败(fail-safe)的区别-爱代码爱编程

fail-fast和fail-safe比较 Iterator 的安全失败是基于对底层集合做拷贝,因此,它不受集合上的修改的影响。java.util 包下面所有的集合类都是安全失败的。快速失败的迭代器会抛出 ConcurrentModificationException 异常,而安全失败的迭代器永远不会抛出这样的异常。快速失败示例 import java.

java 中的fail-fast和fail-safe机制-爱代码爱编程

一、fail-fast 快速失败机制           在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。           原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期

一文彻底弄懂fail-fast、fail-safe机制(带你撸源码)-爱代码爱编程

你好,我是养猪的程序猿,平时喜欢折腾技术、养养“猪”,会不定期分享一些技术文章。 关注我,不迷路~ 文章目录 一文彻底弄懂fail-fast、fail-safe机制(带你撸源码)什么是fail-fast(快速失败)?fail-fast的原理如何避免fail-fast抛异常?什么是fail-safe(安全失败)?总结 一文彻底弄懂fa

ArrayList的fail-fast和fail-safe机制-爱代码爱编程

ArrayList的fail-fast fail-fast是集合中比较常见的错误检测机制。一般在对集合元素进行遍历的时候发生。打个不恰当的比喻,正在清点仓库的每样物品,突然被加塞进来或者被拿走了一些,为了保证清点结果准确,当作清点有误,要重新开始。对于ArrayList来说,首先它是线程不安全的,快速失败机制也常见于多线程的情况,单线程也会发生。Arra

Java 中的 Fail-Fast 与 Fail-Safe-爱代码爱编程

文章目录 Fail-Fast 与 Fail-Safe 机制Fail-Fast如下代码会抛出异常吗?Q1Q2Q3如何避免 fail-fast 异常Fail-Safe参考文章 Fail-Fast 与 Fail-Safe 机制 相信不少同学都遇到过在遍历集合的同时,判断满足某些条件的时候 remove 元素,然后报错的情况,这其实是 Java 中集

面试题:Fail-fast和Fail-safe的区别(源码分析)-爱代码爱编程

前言: 我们都知道迭代器是用来遍历集合的,比如List和Set。那么在考虑多线程之后我们需要思考这么个问题,在我们遍历这个集合的时候,该集合是否允许其他人或者其它线程同时去访问遍历该集合呢,如果允许的话万一遍历的时候该集合被修改了该怎么办呢;要是不允许又是怎样的一个机制呢,这就牵扯出了两种策略:Fail-fast和Fail-safe。我们先来看一下这两种

「Fail-Fast与Fail-Safe机制」-爱代码爱编程

「Fail-Fast与Fail-Safe机制」 写在前面 最近在刷题的过程中又重新熟悉一遍常用的数据结构,发现对Fail-Fast与Fail-Safe机制有点模糊了,这里重新整理一下,加深一下印象。提醒在平时开发过程中严谨处理数据结构相关的内容。 文档中的注释 Note that this implementation is not sync

什么是快速失败(fail-fast)和安全失败(fail-safe)?_lambda丶雨辰的博客-爱代码爱编程

① 快速失败(fail—fast): 现象:在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception(并发修改异常)。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变

什么是fail-fast和fail-safe_键盘上的钢琴家‍的博客-爱代码爱编程

fail-fast fail-fast其实是一种设计理念,就是在系统设计之前先考虑异常,一旦发生异常就开始上报,举个简单例子 在divide方法中当我们这两个值中有其中一个为0便会抛出异常,并提示异常信息。这其实就是fail-fast的思想。 fail-fast 是一种很好的机制,但是使用不好也会是个“坑” 导致 fail-fast 机制报出异常一般是两

fail-fast和fail-safe的解释_handsomeyxl的博客-爱代码爱编程

1.我们先来想一个问题,就是我在遍历集合的时候允不允许其他人来修改我的集合了,如果允许,我的集合被改乱了怎么办,如果不允许会发生什么呢? 2.我们先来介绍一下这两个概念     Fail-Fast:遍历的同时如果其它人来修改,尽快失败,则立即抛出异常(ConcurrentModificationException)     Fail-Safe:遍历的

详解迭代器的 fail-fast 与 fail-safe 机制_程序桃子的博客-爱代码爱编程

目录 fail-fast 机制 重现 fail-fast 产生 fail-fast 机制的原因 fail-safe 机制 重现 fail-safe fail-safe原理 总结 fail-fast 机制 fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可

fail-爱代码爱编程

fail-fast fail-fast的字面意思是快速失败。当在遍历集合元素时,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构被改变的话,就会抛出异常,防止继续遍历。这就是所谓的快速失败机制。 fail-fast即快速失败机制,它是java集合中的一种错误检测机制,当多个线程(当个线程也是可以),在结构上对集合进行改变时,就有可能会产生fa