【Java面试高频-集合】Java集合中的快速失败机制fail-fast和fail-safe是怎么样的?
发布日期:2021-06-29 15:36:44 浏览次数:2 分类:技术文章

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

Java集合的快速失败机制fail-fast和fail-safe?

fail-fast机制

在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了(增加、删除),会抛出Concrrent Modification Eception。

原理:迭代器在遍历过程中直接访问集合中的元素,并且在遍历过程中使用一个modCount变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hasNext/next遍历下一个元素时,都会检测modCount是否为expectedmodCOunt值,是的话就返回遍历;否则抛出异常,终止遍历。

public static void main(String[] args) {
List
list = new ArrayList<>(); for (int i = 0 ; i < 10 ; i++ ) {
list.add(i + ""); } Iterator
iterator = list.iterator(); int i = 0 ; while(iterator.hasNext()) {
if (i == 3) {
list.remove(3); } System.out.println(iterator.next()); i ++; }public static void main(String[] args) {
HashMap
map = new HashMap<>(); map.put("1",1); map.put("2",2); map.put("3",3); map.put("4",4); Iterator
> iteratormmap = map.entrySet().iterator(); System.out.println(map.toString()); int i=0; while(iteratormmap.hasNext()){
if(++i==1){
System.out.println("执行修改");// map.put("1",5); map.put("5",5); //修改了结构 抛ConcurrentModificationException } System.out.println(iteratormmap.next()); } System.out.println(map.toString()); }

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

fail-safe

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

在java.util.concurrent包下的容器并没有使用modCount之类的来保证并发修改。而是通过加锁来实现对“写写”的解决,以及对copyonwrite即COW技术来实现对读写的解决。

转载地址:https://codingchaozhang.blog.csdn.net/article/details/116736669 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Java面试高频-集合】- 读写的场景设计集合是怎么样?对于读多写少要如何设计的呢?对于读少写多又该如何设计呢?
下一篇:【计算机网络面试高频】- 域名解析协议DNS的查找过程

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月28日 19时44分15秒