博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试官:说说快速失败和安全失败是什么
阅读量:6701 次
发布时间:2019-06-25

本文共 1930 字,大约阅读时间需要 6 分钟。

什么是快速失败(fail-fast)和安全失败(fail-safe)?它们又和什么内容有关系。以上两点就是这篇文章的内容,废话不多话,正文请慢用。

我们都接触 HashMap、ArrayList 这些集合类,这些在 java.util 包的集合类就都是快速失败的;而 java.util.concurrent 包下的类都是安全失败,比如:ConcurrentHashMap。

1. 快速失败(fail-fast)

在使用迭代器对集合对象进行遍历的时候,如果 A 线程正在对集合进行遍历,此时 B 线程对集合进行修改(增加、删除、修改),或者 A 线程在遍历过程中对集合进行修改,都会导致 A 线程抛出 ConcurrentModificationException 异常。

具体效果我们看下代码:

HashMap hashMap = new HashMap();        hashMap.put("不只Java-1", 1);        hashMap.put("不只Java-2", 2);        hashMap.put("不只Java-3", 3);        Set set = hashMap.entrySet();        Iterator iterator = set.iterator();        while (iterator.hasNext()) {            System.out.println(iterator.next());            hashMap.put("下次循环会抛异常", 4);            System.out.println("此时 hashMap 长度为" + hashMap.size());        }

执行后的效果如下图:

为什么在用迭代器遍历时,修改集合就会抛异常时?

原因是迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。

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

2. 安全失败(fail-safe)

明白了什么是快速失败之后,安全失败也是非常好理解的。

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

由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,故不会抛 ConcurrentModificationException 异常

我们上代码看下是不是这样

ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap();        concurrentHashMap.put("不只Java-1", 1);        concurrentHashMap.put("不只Java-2", 2);        concurrentHashMap.put("不只Java-3", 3);        Set set = concurrentHashMap.entrySet();        Iterator iterator = set.iterator();        while (iterator.hasNext()) {            System.out.println(iterator.next());            concurrentHashMap.put("下次循环正常执行", 4);        }        System.out.println("程序结束");

运行效果如下,的确不会抛异常,程序正常执行。

<div align=center>

最后说明一下,快速失败和安全失败是对迭代器而言的。并发环境下建议使用 java.util.concurrent 包下的容器类,除非没有修改操作。

我是七淅 (xī),后台回复「Java」,送你 13 本 Java 经典电子书。公众号专注分享 Java 干货、读书笔记、成长思考。

参考文章:

如果你喜欢本文,欢迎来微信公众号「不只Java」和我一起学(wan)习(shua)。后台回复「Java」,送你 13 本 Java 经典电子书。公众号专注分享 Java 干货、读书笔记、成长思考

图片描述

转载地址:http://riwlo.baihongyu.com/

你可能感兴趣的文章
关于IoT网络的一些特征的探讨
查看>>
tkinter的GUI设计:界面与逻辑分离(一)-- 初次见面
查看>>
拓扑学中凝聚点的几个等价定义
查看>>
64.5. PHP mail()
查看>>
iOS微信6.5.19可生成自己的赞赏码
查看>>
你的GitHub Guides探险
查看>>
jsch上传文件功能
查看>>
iOS - Swift Closure 闭包
查看>>
新版 Edge 浏览器 Logo 曝光:形状相同,但为黄色背景
查看>>
Mac下遇到 &#39;reading initial communication packet’ 问题
查看>>
手把手教你webpack3(10)Less-Loader配置简述
查看>>
Hadoop设置环境变量注意事项
查看>>
SAP MM Service Specification的使用?
查看>>
github优质图书
查看>>
第 35 章 dnsmasq
查看>>
武汉往事之借钱识朋友
查看>>
python中的文件操作
查看>>
ASM基本配置问题
查看>>
让程序猿和攻城狮更敬业
查看>>
aix 下删除一个卷组vg
查看>>