在前几个回合中,我们已经详细了解过了 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:

  1. 单线程环境:在遍历过程中,修改了集合,会发生 fail-fast 异常;
  2. 多线程环境:一个线程正在遍历集合的时候,另一个线程对集合进行了修改,会导致遍历线程发生 fail-fast。

fail-safe(安全失败)

现象

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

原理

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

说明

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

存在的问题

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

  1. 因为需要复制集合对象,导致内存开销大;
  2. 因为循环是在复制集合上进行的,所以无法保证数据的一致性。

Java集合系列推荐

Java集合03——你不得不了解的Map

Java集合02——三分钟了解你必须掌握的两个Set

Java集合01——List 的几个实现类,了解一下?

Java集合04——fail-fast&fail-safe 详解的更多相关文章

  1. java集合HashMap、HashTable、HashSet详解

    一.Set和Map关系 Set代表集合元素无序,集合元素不可重复的集合,Map代表一种由多个key-value组成的集合,map集合是set集合的扩展只是名称不同,对应如下 二.HashMap的工作原 ...

  2. Java集合【2】--iterator接口详解

    目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...

  3. 转 Java虚拟机5:Java垃圾回收(GC)机制详解

    转 Java虚拟机5:Java垃圾回收(GC)机制详解 Java虚拟机5:Java垃圾回收(GC)机制详解 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无 ...

  4. Java生鲜电商平台-Java后端生成Token架构与设计详解

    Java生鲜电商平台-Java后端生成Token架构与设计详解 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1. ...

  5. 基于集合成工控机Ubuntu系统安装分区详解

    基于集合成工控机Ubuntu系统安装分区详解 硬件描述:双核的CPU,128G的固态硬盘 软件描述:使用Ubuntu12.04系统,内核3.8.0-29版本,QT4.8.1版本 1.新建分区表 /de ...

  6. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  7. Java中的equals和hashCode方法详解

    Java中的equals和hashCode方法详解  转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...

  8. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  9. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

  10. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

随机推荐

  1. 手撸XGBoost流程(未完成)

    网上的一篇文章,讲的挺清楚的. XGBoost原理分析及实践 XGBoost的原理 xgboost原理--刘建平博客 要注意的地方: 1.预测值y(pred)和损失函数L(y,y(hat))中的y(h ...

  2. python多进程之IPC机制以及生产者消费者模型

    1.进程间通信(IPC机制) 第一种:管道 import subprocessres=subprocess.Popen('dir',shell=True, stdout=subprocess.PIPE ...

  3. OpenCV 基本的阈值操作

    #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...

  4. insecticide|contradictions| at large|delay doing|

    N-MASS 杀虫剂;杀虫药Insecticide is a chemical substance that is used to kill insects. Spray the plants wit ...

  5. Ajax 请求参数过多导致 400 错误 and BCryptPasswordEncoder 加密判断

    2019/06/19 先分享一种密码加密方式: Spring Security 提供了 BCryptPasswordEncoder类, 实现Spring的PasswordEncoder接口使用BCry ...

  6. netty源码分析(十八)Netty底层架构系统总结与应用实践

    一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...

  7. Shell字符串比较相等、不相等方法小结

    #!/bin/sh #测试各种字符串比较操作. #shell中对变量的值添加单引号,爽引号和不添加的区别:对类型来说是无关的,即不是添加了引号就变成了字符串类型, #单引号不对相关量进行替换,如不对$ ...

  8. H5本地离线存储

    前言上一篇文件结尾,有同学问我本地存储图片方法,其实本地存储方式有很多,我们打开谷歌浏览器,查看源代码,在resources页签中,有web SQl ,indexedDB等等,我前面文章讲过Local ...

  9. Jenkins之邮件通知

    Jenkins默认有一个邮件通知功能,但功能比较单一,能自定义的东西很少,一般使用Extended E-mail Notification插件来发送邮件,EXT Email插件功能比较多,但设置也比较 ...

  10. 正则提取关键字符-python代码实现

    原文地址:http://www.bugingcode.com/blog/python_re_extraction_key.html 关于python的正则使用在以前的文章中 http://www.bu ...