`
dsxwjhf
  • 浏览: 73016 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论
阅读更多
本文大部分内容来源于网络,如有侵权,请站内联系。

什么是 fail-fast ?

一个 fail-fast 的系统是指当发现任何可能导致过程失败的情况时,立刻抛出错误。一个 fail-fast 的迭代器是指当迭代的集合正在迭代时检测到集合发生了修改,就立刻抛出一个异常。

ArrayList 的 fail-fast 的实现

public class ArrayList {

    // 用来记录修改次数(继承自 AbstractList)
    protected transient int modCount = 0;

    add() / remove() / trimToSize() / ensureCapacity() ... {
        // 每次修改, modCount 均自增
        modCount++;
    }

    class Iter implements Iterator<E> {

        // 记录 modCount 当前值(一次快照)
        int expectedModCount = modCount;

        public E next() {
            // next() 操作之前, check 一次
            checkForComodification();
            ...
        }

        public void remove() {
            // remove() 操作之前, check 一次
            checkForComodification();
            ...
            ArrayList.this.remove(lastRet);
            ...
            // 更新 expectedModCount 。这说明通过 iter 的 remove() 来删除元素不会抛出 ConcurrentModificationException
            expectedModCount = modCount;
        }

        final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }

    }

}

如何一边遍历一边修改?

1. 使用迭代器;
    Iterator<Integer> iter = list.iterator();
    while (iter.hasNext()) {
        int item = iter.next();
        if (item % 2 == 0) {
            iter.remove();
        }
    }
2. 使用 CopyOnWriteArrayList ;
3. 不要边遍历边修改,使用 temp 。

ConcurrentModificationException 这个异常看起来像是“多线程并发修改异常”,其实单线程下的迭代时修改也可能会出现这个异常。单线程下,迭代时通过集合自身的操作修改集合,会引发异常;通过迭代器修改(即 iter.remove() )不会引发。多线程下,迭代时通过迭代器修改可能会引发 ConcurrentModificationException ,此时应该使用线程安全的集合。
分享到:
评论

相关推荐

    【面试普通人VS高手系列】Fail-safe机制与Fail-fast机制分别有什么作用.doc

    Fail-safe机制与Fail-fast机制的比较分析 在多线程并发操作中,Fail-safe机制和Fail-fast机制是两种常见的失败处理机制,它们的作用和实现原理有所不同。 Fail-fast机制是一种快速失败机制,在集合遍历过程中,...

    前端开源库-hydro-fail-fast

    【前端开源库-hydro-fail-fast】是一个专为前端开发者设计的开源库,其核心功能是在测试过程中实现“液压快速失效”机制。这个概念源于工程领域,尤其在液压试验中,当系统首次检测到异常或故障时,为了保护设备和...

    Fail-Fast机制1

    Fail-Fast机制是一种Java集合框架中的设计策略,主要用于在多线程环境下确保程序的正确性和稳定性。当一个线程在遍历集合时,如果另一个线程对集合进行了结构上的修改,Fail-Fast机制会立即抛出`...

    一不小心就让Java开发踩坑的fail-fast是个什么鬼?(推荐)

    Java fail-fast 机制详解 Java fail-fast 机制是一种系统设计理念,旨在快速检测和报告可能的故障情况,以便尽早采取措施避免更大的错误。这种机制的主要思想是,在系统设计时考虑到异常情况,并在检测到错误时...

    fail-safe fail-fast知多少

    【Fail-safe 和 Fail-fast Iterator 知识点详解】 在Java编程中,集合类是我们处理数据时不可或缺的一部分。在遍历集合元素时,我们通常会使用迭代器(Iterator)。然而,当我们尝试在遍历过程中修改集合时,可能会...

    cypress-fail-fast:赛普拉斯插件可在首次失败时跳过测试

    目录常见方案的配置示例并行运行的配置TypeScript的用法 安装将插件添加到devDependenciesnpm i --save-dev cypress-fail-fast 在cypress/plugins/index.js内部: module . exports = ( on , config ) =&gt; { require ...

    老生常谈java中的fail-fast机制

    Java中的Fail-Fast机制详解 Java中的Fail-Fast机制是一种错误检测机制,当多个线程对集合进行结构上的改变操作时,有可能会产生Fail-Fast机制。这种机制是Java集合框架的一部分,可以帮助检测并发修改引发的错误。 ...

    minitest-fail-fast:重新实现RSpec的“快速故障”功能以实现最小测试

    最小测试:: FailFast 重新实现RSpec的故障快速功能,因为存在测试失败,该功能将退出运行测试套件。 安装 将此行添加到您的应用程序的Gemfile中: gem 'minitest-fail-fast' 然后执行: $ bundle 或将其自己...

    grunt-fail-fast-task-runner:在多个Grunt项目上运行任务的Grunt任务,这些任务很快就会失败

    npm install grunt-fail-fast-task-runner --save-dev 插件安装完成后,可以使用以下JavaScript代码在您的Gruntfile中启用该插件: grunt . loadNpmTasks ( 'grunt-fail-fast-task-runner' ) ; “ fail_fast_task_...

    解析Java的迭代器中的fast-fail错误检测机制

    fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所...

    Java面试题-基础-集合有关的知名厂商面试题和基础复习

    掌握 Iterator 的 fail-fast 、fail-safe 机制 ArrayList() 会使用长度为零的数组 ArrayList(int initialCapacity) 会使用指定容量的数组 public ArrayList(Collection&lt;? extends E&gt; c) 会使用 c 的大小作为数组...

    2023年Java面试题+详细总结.docx

    fail-fast 是 Java 集合框架中的一个机制,当多个线程对同一个集合的内容进行操作时,就可能会产生 fail-fast 事件。例如:当某一个线程 A 通过 iterator 去遍历某集合的过程中,若该集合的内容被其他线程所改变了;...

    oracle 12 c ORA-01017: 用户名/口令无效; 登录被拒绝

    ### Oracle 12c ORA-01017 错误详解及解决方案 #### 错误概述 ...登录被拒绝”。... #### 核心知识点解析 **1....- **文件路径与内容**:为了确保能够正确地连接到指定的Pluggable Database (PDB),需要在`$ORACLE_HOME/...

    Java集合类面试题.docx

    fail-fast会在检测到并发修改时立即抛出异常,而fail-safe则使用复制集合的方式,允许并发修改,但可能返回旧的或不完整的结果。 15. **在迭代一个集合的时候,如何避免ConcurrentModificationException?** 使用...

    java-集合-知识点汇总

    * fail-fast与fail-safe:Java集合在遍历时可能会抛出ConcurrentModificationException异常,这是因为集合在遍历时可能会被修改。fail-fast机制将抛出异常,而fail-safe机制将忽略修改。 * transient关键字:在...

    Java Collections Interview Questions.pdf

    fail-fast 和 fail-safe 迭代器是 Java Collections 框架中的两种迭代器模式。fail-fast 迭代器在集合修改时,会抛出 ConcurrentModificationException 异常。fail-safe 迭代器在集合修改时,会返回当前集合的快照。...

    erlang-18.3.4.7-1.el6.x86_64.rpm

    rabbitmq依赖包。...●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ●函数式编程 ●动态类型 ●及早求值或严格求值 ●支持脚本运行

    Java 集合方面的面试题

    什么是 fail-fast 机制? 如何使用 Collections 类对集合进行排序? 什么是 Comparable 和 Comparator 接口?它们有什么区别? 如何使用 ConcurrentHashMap 类来实现线程安全的映射? 如何避免在多线程环境下对同一...

Global site tag (gtag.js) - Google Analytics