Fail-Fast机制和ConcurrentModificationException并发修改异常

news/2024/5/20 6:51:01 标签: Java, Fail-Fast机制, 并发修改异常, JUC

目录

说明

  Fail-Fast机制和ConcurrentModificationException并发修改异常是我们在编写代码的时候经常遇到的问题和异常,我们需要搞清楚这个机制是什么东西并且为什么会抛出这个异常,如何进行解决。
 
 

Fail-Fast机制

  Fail-Fast机制Java集合框架中的一种错误机制,当多个线程对一个不安全的集合进行操作时,就可能会出现fail-fast机制。
  我们来举个例子:当我们的线程A正在使用iterator去遍历一个ArrayList或者是HashMap的时候,另一个线程B在线程A遍历的时候对该List或者Map进行add、delete、clear,这个时候线程A就很可能会抛出ConcurrentModificationException并发修改异常,产生fail-fast错误机制。
 

Fail-Fast机制的理解

  我们可以这样理解Fail-Fast机制,在集合遍历之前,我们先把集合的size,也就是modCount记录下来,在集合遍历之后产生的expectModCount,我们将modCount和expectModCount进行比较,如果不相等,那么就抛出ConcurrentModificationException并发修改异常,产生fail-fast错误机制。

 

如何解决Fail-Fast错误机制的问题

  在高并发的情况下,建议使用“java.util.concurrent”包下的类去代替“java.util”包下的类,一般我们使用List会使用到ArrayList,使用Map会使用HashMap。

ArrayList


            List<Integer> list = new ArrayList<>();
            list.add(1);
            list.add(2);
            list.add(3);
            Iterator<Integer> iterator = list.iterator();
            while (iterator.hasNext()) {
                  Integer next = iterator.next();
                  if (next.equals(1)) {
                        list.remove(1);
                  }
            }

请添加图片描述

 
 
HashMap

            Map<Integer,Integer> map = new HashMap<>();
            map.put(1,1);
            map.put(2,1);
            map.put(3,1);
            Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
            for (Map.Entry<Integer, Integer> entry : entries) {
                  if (entry.getKey() == 2) {
                        map.remove(2);
                  }
            }

在这里插入图片描述
解决方案:

  • 我们使用CopyOnWriteArrayList----来代替ArrayList。
  • 我们使用ConcurrentHashMap----来代替HashMap。

 
 
 
  
  
  


http://www.niftyadmin.cn/n/210843.html

相关文章

SpringMVC具体过程

SpringMVC是一种基于Java的Web框架&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;设计模式来实现Web应用程序。SpringMVC框架大致的处理流程如下&#xff1a; 客户端发送请求到DispatcherServlet&#xff1b;DispatcherServlet将请求发送给HandlerMappi…

传统汽车保险丝盒与智能保险丝盒Efuse的应用

一、传统汽车保险丝盒 1、概述 电气盒是用于提供车辆电源分配和回路保护的电气枢纽。电气盒能简化线束的安装和整车的装配过程&#xff0c;改善系统的整体质量水平&#xff0c;降低成本和减少散乱。 一般传统电气盒分为PFB&#xff08;预保险丝盒&#xff09;&#xff0c;UE…

数组(八)-- LC[53][152] 最大子数组之和与乘积最大子数组

1 最大子数组之和 1.1 题目描述 题目链接&#xff1a;https://leetcode.cn/problems/maximum-subarray/ 1.2 求解思路 1. 暴力法 class Solution:def maxSubArray(self, nums: List[int]) -> int:length len(nums)max_sum float(-inf)for i in range(length):sum_sub_…

1.C 语言简介

文章目录前言一、C 语言简介1.历史2.C 语言的特点3.C 语言的版本4.C 语言的编译5.Hello World 示例前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 无论是小白入门计算机&#xff0c;还是参加各种考试&#xff0c;C语言都应该学习&#xff0c;本篇内容帮…

SpringBoot项目部署配置的优先级

SpringBoot项目当中支持的三类配置文件&#xff1a; application.propertiesapplication.ymlapplication.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中的任意一种来配置都可以&#xff0c;那么如果项目中同时存在这三种配置…

休假 复习

# 村村通 ## 题目描述 某市调查城镇交通状况&#xff0c;得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通&#xff08;但不一定有直接的道路相连&#xff0c;只要相互之间可达即可&am…

python系列教程-python的基础语法

文章目录一、字面量二、常用的值类型2.1 字符串2.2 我们如何在代码里书写他们呢&#xff1f;三、注释3.1 注释的定义3.2 注释的作用3.3 注释的分类四、变量4.1 什么是变量4.2 为什么要用变量五、数据类型5.1 常用的数据类型5.2 如何判断当前的数据类型呢&#xff1f;六 数据类型…

day19—选择题

文章目录1.下列关于线性链表的叙述中&#xff0c;正确的是&#xff08;C &#xff09;2.下列数据结构中&#xff0c;不能采用顺序存储结构的是&#xff08; A&#xff09;3.递归函数最终会结束&#xff0c;那么这个函数一定&#xff08;B&#xff09;4.以下序列不是堆的是&…