Java面典_Java集合04——fail-fastfail-safe 详解
在前几个回合中,我们已经详细了解过了 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 详解相关推荐
- Java指令全集_Java的JVM字节码指令集详解
本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...
- java foreach标签_Java中Velocity foreach循环标签详解
Java中Velocity foreach循环标签详解 Java Velocity中foreach循环可以很容易的遍历数组或者集合. 定义 #foreach( $elem in $allElems) ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- java 静态 编译_Java中的动态和静态编译实例详解
Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...
- java switch 值_Java switch多值匹配操作详解
这篇文章主要介绍了Java switch多值匹配操作详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知道 switch 用来走流程分支,大 ...
- java 分割数据_java 分割csv数据的实例详解
java 分割csv数据的实例详解 实际需要解析的csv中很多都是从excel中转过来的,数据中本身包含了逗号的数据导致split的过程中发现数据对不上,因此,基于这种特性,重新写了一个csv数据的分 ...
- java 接口函数_Java函数式接口Supplier接口实例详解
这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...
- java supplier接口_Java函数式接口Supplier接口实例详解
这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...
- java集合框架的接口_Java集合框架之Collection接口详解
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
- java 字符串倍_java字符串拼接与性能分析详解
假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用"+"的话将得到最低的性能.但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder ...
最新文章
- 看到这儿,你就不会再轻易相信自己的眼睛
- 大话中文文本分类之TextRCNN
- how is our custom css style inserted to html
- 用turtle画皮卡丘
- leetcode剑指 Offer 20. 表示数值的字符串
- android 自定义特效,Android自定义FloatingText仿点赞+1特效
- C++_数据类型_布尔类型_以及数据的输入_以及算术运算符_加减乘除运算---C++语言工作笔记013
- SELinux系列(一)——SELinux是什么
- TLS1.1升级到TLS1.2(微信小程序要求TLS1.2以上)
- rpm软件包管理的详细解读
- maven私服搭建:docker安装Sonatype Nexus以及寻找admin用户对应的随机初始密码
- 用户体验报告(Echo)
- 寻找指定型别的父控件
- 提高 Mac OS X 速度的 52 个方法
- 可以免费测试的短信验证码接口接入
- ESP32 硬件开发指北 -- 外接FLASH使用指北
- 批量删除多个word文档中的页眉页脚
- C++ access( )函数
- 台式电脑经常碰到的一些问题
- 数据分析报告怎么写?
热门文章
- 鹏华基金:科技赋能 打造公募基金的头部机构
- 瑞信:区块链技术还在半山腰 2025年才能真正成熟
- 【图像去雾】基于matlab GUI直方图均衡化+Retinex理论图像去雾【含Matlab源码 1509期】
- 【疫情模型】基于matalb改进的SEIR模型【含Matlab源码 667期】
- ai人工智能有哪些_进入AI有多么简单
- 梯度离散_使用策略梯度同时进行连续/离散超参数调整
- +0.5(加0.5)配合int()实现四舍五入
- ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。
- java new char 初始化_java考试复习
- em模型补缺失值_EM算法学习(三)