在前几个回合中,我们已经详细了解过了 Java 集合中的List、Set 和 Map,对这部分内容感兴趣的朋友可以关注我的公众号「Java面典」了解。今天我们将为各位介绍集合的失败机制——fail-fast与fail-safe。

fail-fast(快速失败)

现象

在用迭代器遍历集合对象的时候,如果此时对集合对象进行了增加、删除、修改操作的时候,会抛出Concurrent Modification Exception。

原理

modCount :表示集合的修改次数,包括了调用集合本身修改方法(如 add、remove)进行的修改和调用集合迭代器修改方法进行的修改;

expectedmodCount:表示迭代器对集合进行修改的次数;

当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测 modCount 是否与 expectedmodCount 相等,是的话就返回遍历;否则抛出异常,终止遍历。

说明

java.util 包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。

场景

以下两种场景会导致 fail-fast:

单线程环境:在遍历过程中,修改了集合,会发生 fail-fast 异常;

多线程环境:一个线程正在遍历集合的时候,另一个线程对集合进行了修改,会导致遍历线程发生 fail-fast。

fail-safe(安全失败)

现象

采用安全失败机制的集合容器,在遍历时不是直接在原集合遍历的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

原理

由于遍历是在拷贝集合上进行的,而修改是在原集合上执行的。所以对原集合的修改,并不会导致异常的发生。

说明

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

存在的问题

fail-safe 虽然不会抛出 ConcurrentModificationException 异常,但是也存在其问题:

因为需要复制集合对象,导致内存开销大;

因为循环是在复制集合上进行的,所以无法保证数据的一致性。

Java集合系列推荐

Java面典_Java集合04——fail-fastfail-safe 详解相关推荐

  1. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  2. java foreach标签_Java中Velocity foreach循环标签详解

    Java中Velocity foreach循环标签详解 Java Velocity中foreach循环可以很容易的遍历数组或者集合. 定义 #foreach( $elem in $allElems) ...

  3. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  4. java 静态 编译_Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...

  5. java switch 值_Java switch多值匹配操作详解

    这篇文章主要介绍了Java switch多值匹配操作详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知道 switch 用来走流程分支,大 ...

  6. java 分割数据_java 分割csv数据的实例详解

    java 分割csv数据的实例详解 实际需要解析的csv中很多都是从excel中转过来的,数据中本身包含了逗号的数据导致split的过程中发现数据对不上,因此,基于这种特性,重新写了一个csv数据的分 ...

  7. java 接口函数_Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...

  8. java supplier接口_Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...

  9. java集合框架的接口_Java集合框架之Collection接口详解

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  10. java 字符串倍_java字符串拼接与性能分析详解

    假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用"+"的话将得到最低的性能.但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder ...

最新文章

  1. 看到这儿,你就不会再轻易相信自己的眼睛
  2. 大话中文文本分类之TextRCNN
  3. how is our custom css style inserted to html
  4. 用turtle画皮卡丘
  5. leetcode剑指 Offer 20. 表示数值的字符串
  6. android 自定义特效,Android自定义FloatingText仿点赞+1特效
  7. C++_数据类型_布尔类型_以及数据的输入_以及算术运算符_加减乘除运算---C++语言工作笔记013
  8. SELinux系列(一)——SELinux是什么
  9. TLS1.1升级到TLS1.2(微信小程序要求TLS1.2以上)
  10. rpm软件包管理的详细解读
  11. maven私服搭建:docker安装Sonatype Nexus以及寻找admin用户对应的随机初始密码
  12. 用户体验报告(Echo)
  13. 寻找指定型别的父控件
  14. 提高 Mac OS X 速度的 52 个方法
  15. 可以免费测试的短信验证码接口接入
  16. ESP32 硬件开发指北 -- 外接FLASH使用指北
  17. 批量删除多个word文档中的页眉页脚
  18. C++ access( )函数
  19. 台式电脑经常碰到的一些问题
  20. 数据分析报告怎么写?

热门文章

  1. 鹏华基金:科技赋能 打造公募基金的头部机构
  2. 瑞信:区块链技术还在半山腰 2025年才能真正成熟
  3. 【图像去雾】基于matlab GUI直方图均衡化+Retinex理论图像去雾【含Matlab源码 1509期】
  4. 【疫情模型】基于matalb改进的SEIR模型【含Matlab源码 667期】
  5. ai人工智能有哪些_进入AI有多么简单
  6. 梯度离散_使用策略梯度同时进行连续/离散超参数调整
  7. +0.5(加0.5)配合int()实现四舍五入
  8. ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。
  9. java new char 初始化_java考试复习
  10. em模型补缺失值_EM算法学习(三)