【字节面试】Fail-fast知识点相关知识点
创始人
2024-05-26 13:56:05
0

字节面试,问到的一个小知识点,这里做一下总结,其实小编之前有一篇文章,已经对此有过涉及,不过这里知识专项针对于问题,把这个知识点拎出来说一下。

1.问题

什么是Fail-fast机制?
Hashmap是否拥有Fail-fast机制?
ConcurrentModificationException异常原因和解决方法是什么?
哪些你常用的数据结构是Fail-fast的,哪些不是?举例说明一下
Enumeration与Iterator的异同?

在这里插入图片描述

2.探索、解答

2.1 Fail-fast机制

从字面意思,很好理解,就是快速失败机制。映射到java设计中,fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

2.2 ConcurrentModificationException

List在for、while正常遍历过程中,如果remove元素,容易出现ConcurrentModificationException 异常,根本原因的话,之前ArrayList源码分析文章已经讲过,各位有兴趣可以移步阅读。

ConcurrentModificationException发生是因为我们在使用迭代器遍历List的同时,还使用了List相应的remove、add进行元素增加或删除,导致不一。

2.3 Enumeration与Iterator的异同

2.3.1 Iterator

java中迭代器接口的源码很简单,我们看下面


package java.util;import java.util.function.Consumer;public interface Iterator {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException("remove");}default void forEachRemaining(Consumer action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());}
}

就是遍历、移除的接口定义,这块知识我们在Android源码设计模式探索与实战【迭代器模式】一文中,对于迭代器设计模式,做过深入剖析,迭代器模式重在容器类集合提供顺序遍历的方式,其实从上面Demo、实践案例、源码中,大家都可以看到,迭代器模式,实际上就是把不同类型的集合的遍历进行了封装, 这样针对于客户端来说,只需关注迭代器接口,不再需要关心内部使用了什么类型的集合。

2.3.2 Enumeration

我们看一下这个接口的源码

package java.util;/*** @see     java.util.Iterator* @see     java.io.SequenceInputStream* @see     java.util.Enumeration#nextElement()* @see     java.util.Hashtable* @see     java.util.Hashtable#elements()* @see     java.util.Hashtable#keys()* @see     java.util.Vector* @see     java.util.Vector#elements()** @author  Lee Boynton* @since   JDK1.0*/
public interface Enumeration {boolean hasMoreElements();E nextElement();
}

只有是否还有元素的判断接口、遍历下一个元素的两个方法定义,并没有移除方法,所以这个玩意,自然而然就不存在Fail-fast和ConcurrentModificationException了。

2.3.3 Enumeration与Iterator异同总结

其实一看源码,相信大家就立马明白了,Enumeration与Iterator都是java定义的集合遍历接口,不同的是Iterator提供了移除接口。
有了移除操作,自然而然就是涉及到多线程安全性,那么就引入了可能存在的ConcurrentModificationException。

2.4 Fail-fast举例

哪些你常用的数据结构是Fail-fast的,哪些不是?上面源码的时候,其实大家已经看到了答案。
Arraylist、HashMap(LinkedHashmap、HashSet本身就是继承与Hashmap的)是有Fail-fast机制的,因为他们都有迭代器Iterator。而HashTable、Vector的某些遍历方式是没有的,因为它实现与Enumeration。

 * @see     java.util.Iterator* @see     java.io.SequenceInputStream* @see     java.util.Enumeration#nextElement()* @see     java.util.Hashtable* @see     java.util.Hashtable#elements()* @see     java.util.Hashtable#keys()* @see     java.util.Vector* @see     java.util.Vector#elements()public class Itbird{
public static void main(String[] args){Vector v = new Vector();v.addElement("my");v.addElement("you");Enumeration e = v.elements();//返回Enumeration对象while(e.hasMoreElements()){String value = (String)e.nextElement();//调用nextElement方法获得元素System.out.print(value);}}
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...