快速失败“fail-fast”和安全失败“fail-safe”

目录

快速失败——fail-fast

异常原因

 正常原因

 安全失败“fail-safe”


快速失败——fail-fast

java的快速失败机制是java集合框架中的一种错误检测机制,当多个线程对集合中的内容进行修改时可能就会抛出ConcurrentModificationException异常。不仅仅在多线程状态下,在单线程中使用增强for循环一边遍历集合一边修改集合的元素也会抛出ConcurrentModificationException异常。例如:

public class Main {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("java");list.add("python");list.add("c++");for (String s:list){list.remove(s);}}
}

抛出异常:

 正确做法使用迭代器的remove()方法,可正常删除

    public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("java");list.add("python");list.add("c++");Iterator<String> iterator = list.iterator();while (iterator.hasNext()){iterator.next();//获取下一个元素iterator.remove();//删除当前元素}}

异常原因

首先查看list.remove()源码:

根据值找到对应的索引后调用fastRemove(index)方法 ,查看fastRemove(int index)方法

 发现第一个元素可以正常删除,但由于使用for-each循环,底层实际使用的是迭代器遍历当执行for (String s : list)时,Java会隐式地创建一个迭代器,并调用iterator()方法开始迭代。迭代过程:在每次循环中,Java会调用迭代器的next()方法获取下一个元素,并将其赋值给s。删除元素:然后执行list.remove(s),这实际上调用了remove()方法,删除了当前引用的元素。

 在调用next()时,里面包含checkForComodification();方法,该方法将modCount和expectedModCount进行比较。

checkForComodification()源码:

        final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}

因此抛出了 ConcurrentModificationException异常。

 正常原因

由于迭代器使用的remove()和上面的remove()方法不同,源码:

 迭代器的remove()方法保证了expectedModCount = modCount;因此也保证了不会出现ConcurrentModificationException异常。

虽然在线程下,使用迭代器可以避免ConcurrentModificationException异常,但是在多线程下,使用迭代器的remove()方法还会报异常。

        这是因为modCount是在AbstractList类中定义的,而expectedModCount是在ArrayList内部类中定义,所以modCount是一个共享变量,而expectedModCount是属于线程各自的。

例如:当线程1更新了modCount属于自己的expectedModCount,而线程2只有看到modCount更新,自己的expectedModCount并没有更新,因此抛出ConcurrentModificationException异常。

 例如:

  1. ArrayList
  2. Vector
  3. HashMap
  4. HashSet
  5. LinkedHashMap
  6. LinkedHashSet

实现了"fail-fast"机制。

 安全失败“fail-safe”

在遍历集合时,不是直接在集合内容上进行访问,而是先复制原有集合内容,在复制的集合上进行遍历,在遍历时,对集合的修改是不会被迭代器检测到,所以不会抛出ConcurrentModificationException异常。

缺点:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间,原集合发生了修改,迭代器是无法访问到的。

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

例如:

  1. CopyOnWriteArrayList、
  2. CopyOnWriteArraySet
  3. ConcurrentHashMap

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

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

相关文章

网络安全等级保护2.0(等保)是什么

等保的全称是信息安全等级保护&#xff0c;是《网络安全法》规定的必须强制执行的&#xff0c;保障公民、社会、国家利益的重要工作。 通俗来讲就是&#xff1a;公司或者单位因为要用互联网&#xff0c;但是网上有坏人&#xff0c;我们不仅要防御外部坏人&#xff0c;还要看看…

2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟

注意开浮点数 ​​​​ import java.util.Scanner;public class Main {static Scanner scnew Scanner(System.in);public static void main(String[] args) {double t0;int cnt0;double distance1000;while(distance>1){//相撞时间tdistance/60.0;distance-t*20;cnt;}Syste…

Text Control 控件 中 Service Pack 3:MailMerge 支持 SVG 图像

图像的合并方式与报告模板中的合并字段相同。占位符在设计时添加&#xff0c;并与文件、数据库或内存中的数据合并。可以将图像对象添加到具有指定名称的模板中。数据列必须包含字节数组形式的二进制图像数据、System.Drawing.Image 类型的对象、文件名、十六进制或 Base64 编码…

【Linux进程篇】父子进程fork函数||进程生死轮回状态||僵尸进程与孤儿进程

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;上篇文章中我们认识了进程&#xff0c;可执行程序在内存中加载运行被称作进程&#xff0c;而操作系统是通过给每一个可执行程序创建一个PCB来管理进程的。并且学习了一些查看进程的指令&#xff0c;认识…

香橙派AIpro开发板开箱体验,国产AI计算力实现可控

一、引言 1. 嵌入式AI技术背景与发展趋势 近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;嵌入式AI技术在各个领域得到了广泛应用。作为智能设备的核心部件&#xff0c;嵌入式AI开发板为开发者提供了高效、便捷的开发环境&#xff0c;推动了智能设备的不断创新和进步…

新闻稿推广策略有哪些?建议收藏

新闻稿推广是一种有效的公关工具&#xff0c;它可以帮助企业或组织传递信息、提升品牌知名度、建立权威形象&#xff0c;并最终促进销售。新闻稿推广策略有哪些&#xff1f;接下来伯乐网络传媒就来给大家分享一下。 确定目标受众&#xff1a;在撰写新闻稿之前&#xff0c;明确你…

重生之 SpringBoot3 入门保姆级学习(06、属性绑定)

重生之 SpringBoot3 入门保姆级学习&#xff08;06、属性绑定&#xff09; 2.3.1 使用 ConfigurationProperties2.3.2 使用 EnableConfigurationProperties 2.3.1 使用 ConfigurationProperties application.properties 文件书写相关配置 pig.id1 pig.name王萍 pig.age21方法一…

揭秘淘宝API接口:轻松连接电商巨头,打造无限商业可能

淘宝API接口是淘宝平台对外开放的一系列接口&#xff0c;通过这些接口&#xff0c;开发者可以获取淘宝平台上的商品信息、订单信息、物流信息等数据&#xff0c;实现与淘宝平台的交互。淘宝API接口支持多种数据格式&#xff0c;如JSON、XML等&#xff0c;方便开发者根据自己的需…

实时工业数据采集分析平台:推动工厂智能化的关键

在当今的工业领域&#xff0c;随着科技的飞速发展和竞争的日益激烈&#xff0c;实现工厂的智能化已成为企业追求持续发展的关键目标。而实时工业数据采集分析平台作为推动工厂智能化的重要力量&#xff0c;正发挥着重要的作用。 实时工业数据采集分析平台能够全方位、高精度地…

elementPlus+vue3易踩的坑之el-radio单选框:为什么默认选项都被勾选了?

出错的效果&#xff1a; 选项都被选中了...... 明明是从elementplus复制过来的代码&#xff08;如下&#xff09;&#xff0c;怎么会出现这个情况呢&#xff1f; <el-radio-group v-model"radio"><el-radio value"1">通过</el-radio>&…

Windows:安装Win10、Win7系统常用的2种方式及相关问题处理

一、准备工作 1、U盘 首先&#xff0c;我们要准备一个8G左右大小的U盘 2、下载镜像文件 参考∶ 镜像文件下载及其检验方法 3、新机必备软件 建议安装之前&#xff0c;先把这些软件下载好。 360驱动大师、chrom浏览器、搜狗输入法、爱奇艺万能联播、Notepad、PDF、QQ、微信、…

如何免费把微信视频号的视频下载下来?电脑手机都可使用

今天&#xff0c;我将为大家分享一个实用的技巧&#xff1a;如何免费将微信视频号的视频下载下来。 微信视频号作为一个流行的短视频平台&#xff0c;拥有大量优质内容。然而&#xff0c;由于平台政策限制&#xff0c;我们无法直接下载视频。不过&#xff0c;别担心&#xff0…

Python环境配置以及包管理方法详细介绍

本文记录一下在Windows和Linux上安装部署Python环境以及Python包管理方法。 目录 1 Windows上安装Python2 Linux安装Python2.1 环境准备2.2 安装2.3 验证 3 python虚拟环境3.1 虚拟环境安装3.2 虚拟环境激活3.3 虚拟环境去激活 4 python包管理4.1 pip包管理工具4.2 包安装4.2.1…

拥塞控制的自适应 AQM 探索

拥塞控制面临的几类问题&#xff1a; 网络拥塞时&#xff0c;大象流如何为微突发让路&#xff1b;网络拥塞时&#xff0c;如何只惩罚造成拥塞的流量&#xff1b;网络拥塞时&#xff0c;如何确保小流量不受影响。 既然不想在 host 将流按照大小分类&#xff0c;嫌没意义&#…

【B站 heima】小兔鲜Vue3 项目学习笔记Day05

Day05 文章目录 Day05登录1. 整体认识和路由设置2. 表单校验实现3. 表单-统一校验4. 基础登录业务实现5. Pinia管理用户数据6. Pinia 数据持久化7. 登录和非登录状态下的模板适配8. 请求拦截器携带Token9. 退出登录功能的实现10. Token失效401拦截处理 购物车1. 流程梳理2. 本地…

韬光养晦的超绝项目

发展方向 竞技闯关类 可以加入对战系统积累积分&#xff0c;竞技类的接受程度更高&#xff0c;小孩&#xff08;我和我身边大多数人小时候&#xff09;都喜欢玩王者吃鸡这种经济类游戏&#xff0c;开放世界探索&#xff08;本项目、一梦江湖、逆水寒&#xff09;的受众群体年…

一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

定个小目标之每天刷LeetCode热题(1)

有两种解决方法&#xff1a; 第一种&#xff1a;利用哈希集合不重复的特性&#xff0c;代码展示如下 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> listNode new HashSet<ListNode>();ListNode…

搭贝低代码平台:重塑房地产行业的工作流程与效率

随着数字化转型浪潮席卷全球&#xff0c;房地产行业也开始积极探索利用科技力量提升业务效率与服务质量。搭贝低代码平台&#xff0c;作为一款强大的数字化工具&#xff0c;正逐渐成为房地产企业优化管理流程、加速决策制定的重要推手。本文将深入探讨搭贝如何在房地产行业多个…