【字节面试】Fail-fast知识点相关知识点

news2025/7/17 5:58:21

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

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<E> {

    boolean hasNext();

    E next();


    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> 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<E> {

    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);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/362633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

斯坦福大学团队提出AI生成文本检测器DetectGPT,通过文本对数概率的曲率进行可解释判断

原文链接&#xff1a;https://www.techbeat.net/article-info?id4583 作者&#xff1a;seven_ 随着以ChatGPT等大型语言模型&#xff08;large language models&#xff0c;LLMs&#xff09;的爆火&#xff0c;学界和工业界目前已经开始重视这些模型的安全性&#xff0c;由于C…

DSP28系列 CCS 开发问题总结及解决办法

文章目录 问题汇总 1. CCS编译器的Project菜单栏工程导入选项丢失&#xff0c;怎么解决&#xff01; 1.1启动CCS后发现导入工程菜单栏丢失&#xff0c;无法导入工程文件。 1.2方法一 工程选项的导入工程文件丢失&#xff0c;如果要重新获得相应的选项&#xff0c;就需要删除当前…

Java必备小知识点2——输入输出与变量

变量变量的实质假如将内存比喻成一座房子&#xff0c;存入内存就相当于住进房子。但是如果一个房间给了应人&#xff0c;他却不住&#xff0c;那么房间实际上是空着的&#xff0c;又属于个人&#xff0c;别人无法住进来&#xff0c;就会造成浪费。那么将内存比喻成酒店&#xf…

Cocoa-autoLayout

什么是autoLayout autoLayout的重新布局是通过 constraints 各个view实现自动布局&#xff0c;autoLayout重新调整布局view是在runtime中 autolayout without constraints 也就是通过stack view实现不引入复杂的constraints的情况下 还能使用autoLayout 什么是stack view …

SPDK NVMe-oF Target

SPDK NVMe-oF TargetNVMe协议制定了本机高速访问PCIe SSD的规范&#xff0c;相对于SATA、SAS、AHCI等协议&#xff0c;NVMe协议在带宽、延迟、IOps等方面占据了极大的优势&#xff0c;但是在价格上目前相对来讲还是比较贵的。不过不可否认的是&#xff0c;配置PCIe SSD的服务器…

软件供应链受威胁下的应对方法——供应链安全管理平台的五大工具能力

背景如今&#xff0c;软件供应链安全问题已经成为一个全球性的难题。根据数据统计&#xff0c;2017年全球遭受网络攻击的公司比例已经达到了93&#xff05;&#xff0c;其中很大一部分是由于软件供应链安全问题导致的。而在中国&#xff0c;据统计&#xff0c;2019年全国共发生…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码&#xff0c;支持面向用户级别的行级数据访问控制&#xff0c;即特定用户只能访问授权过的行&#xff0c;隐藏未授权的行数据。此方案是实时领域Flink的解决方案&#xff0c;类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

不可变集合、Stream、异常、日志框架

创建不可变集合 什么是不可变集合&#xff1f;不可变集合&#xff0c;就是不可被修改的集合。集合的数据项在创建的时候提供&#xff0c;并且在整个生命周期中都不可改变。否则报错。为什么要创建不可变集合&#xff1f;如果某个数据不能被修改&#xff0c;把它防御性地拷贝到…

交叉编译 SQLite

交叉编译 SQLite 概述 SQLite 是一个 C 语言库&#xff0c;它实现了一个小型、快速、自包含、高可靠性、功能齐全的 SQL 数据库引擎。SQLite 是世界上使用最多的数据库引擎。SQLite 内置于所有手机和大多数计算机中&#xff0c;并捆绑在人们每天使用的无数其他应用程序中。 S…

java迷宫回溯找最短路径问题(多策略)

1、首先我们先明确迷宫&#xff0c;并创建如上图&#xff0c;1为墙&#xff0c;中间的1为挡板墙&#xff0c;由图我们可以看出这是一个二维数组/*** 创建地图* return*/public static int [][] createMap(){int [][] mapNew new int[8][7];//1表示墙&#xff0c;不能走for (in…

Kaggle系列之识别狗的品种类别(深度残差网络模型ResNet-34)

我们来到这个比赛页面&#xff1a;https://www.kaggle.com/competitions/dog-breed-identification这个数据集的目标是Determine the breed of a dog in an image(确定图像中狗的品种)我们先下载数据集解压之后来看下(当然不手动解压&#xff0c;也可以使用)&#xff0c;这里我…

超全 Vue3新特性总结

Vue3 应用-技术分享与交流 新特性篇 Vue3 组合式 API VS Vue2 选项式 API 选项式 API 面临的问题: 我们在处理业务逻辑时&#xff0c;需要在 data computed method watch 中分别进行代码编写&#xff0c;碎片化使得理解和维护复杂组件变得困难。选项的分离掩盖了潜在的逻辑问…

百度工程师浅谈分布式日志

作者 | 文库基础架构 导读 我们做软件开发时&#xff0c;或多或少的会记录日志。由于日志不是系统的核心功能&#xff0c;常常被忽视&#xff0c;定位问题的时候才想起它。本文由浅入深的探讨不起眼的日志是否重要&#xff0c;以及分布式架构下的日志运维工具应该具备哪些能力&…

【单目标优化算法】海鸥优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

如何使用ODX描述诊断会话和安全等级

ODX 2.2是由ASAM&#xff08;自动化及测量系统标准协会&#xff09;提出的诊断标准&#xff0c;是一种基于XML语言的开放式诊断数据格式&#xff0c;已在国际上得到广泛使用。目前ODX诊断标准也已被国内各大OEM采用&#xff0c;但在ODX数据开发阶段&#xff0c;ODX诊断数据库的…

1.1 数据库简介

文章目录1.什么是数据库2.数据库分类3.关系型数据库和非关系型数据库4.关系型数据库4.1 Mysql数据库4.2 MySQL数据的存放1.什么是数据库 我们可以简单将数据库理解为一个存储数据&#xff0c;管理数据的仓库&#xff1b; 仓库中有许多的货架&#xff08;数据表&#xff09;&a…

JSP 字库销售管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 字库销售管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…

【RecBole-GNN/源码】RecBole-GNN中NCL源码解析

如果觉得我的分享有一定帮助&#xff0c;欢迎关注我的微信公众号 “码农的科研笔记”&#xff0c;了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【RecBole-GNN/源码】RecBole-GNN中NCL源码解析 【RecBole-GNN/源码】RecBole-GNN中NCL源码解析 原文&#xff1a;ht…

【教程】GitStats代码统计工具(附GitLab API相关)

使用GitStats进行代码统计 官方文档&#xff1a;GitStats - git history statistics generator GitStats是基于Git的数据统计生成器&#xff0c;输出格式为HTML&#xff0c;可直接在浏览器打开查看&#xff0c;展现为图表形式的可视化数据&#xff0c;内容包括&#xff1a; 常…

Spring Boot MyBatis-Plus 连接 Oracle 数据库 自动生成代码

IDEA 创建SpringBoot项目 项目创建移步 IDEA创建SpringBoot项目 添加依赖 <!--MyBatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</vers…