当前位置: 首页 > news >正文

java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案

java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案

一. 什么时候会出现并发修改异常?

这里先看需求 : 定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马

很显然要求我们先创建一个集合并进行迭代 , 当迭代到猪八戒,的时候插入白龙马

代码实现

public static void main(String[] args) {//需求:定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马ArrayList<String> list = new ArrayList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒");list.add("沙僧");Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String element = iterator.next();if ("猪八戒".equals(element)){list.add("白龙马");}}System.out.println(list);}

运行后报错

在这里插入图片描述

这里报了一个ConcurrentModificationException 也就是并发修改异常

二. 产生原因

我们来进入源码分析一下

  1. 首先我们来进入 iterator() 方法 , 这里iterator() 是返回了了一个新对象也就是Itr() , 那我们再来看一下Itr()方法

    public Iterator<E> iterator() {return new Itr();}
    
  2. Itr() , 光观察Itr()好像并没有发现异常的原因 , 那我们再看next()方法

    private class Itr implements Iterator<E> {int cursor;       // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint expectedModCount = modCount;// prevent creating a synthetic constructorItr() {}public boolean hasNext() {return cursor != size;}
  3. next() , 这里在运行next()的时候会先调用checkForComodification();方法那我们就先来查看这个方法

    @SuppressWarnings("unchecked")public E next() {checkForComodification();int i = cursor;if (i >= size)throw new NoSuchElementException();Object[] elementData = ArrayList.this.elementData;if (i >= elementData.length)throw new ConcurrentModificationException();cursor = i + 1;return (E) elementData[lastRet = i];}
    
  4. checkForComodification() , 很显然这里判断了modCount 与 expectedModCount是否相等 , 如果不相等则抛出throw new ConcurrentModificationException(); 也就是并发修改异常

    modCount: 实际操作次数
    expectedModCount:预期操作次数

     final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}
    
  5. 那么通过上面的分析我们就知道了产生问题的原因是什么 , 也就是modCount 与 expectedModCount并不相等

    那是什么导致modCount 与 expectedModCount不相等的呢 ? 在代码中我们调用了一个add方法 , 那么add是否就是产生问题的原因

  6. add() , 还是和刚才一样 , 进入add()底层源码我们来找一下原因

    public boolean add(E e) {modCount++;add(e, elementData, size);return true;}
    

    到这里就一目了然了我们在调用add的时候会对modCount++ , 在modCount自增之后 , 我们再调用next()方法就会导致modCount 与 expectedModCount不相等 , 从而抛出异常

三. 解决方法

ArrayList中的方法:ListIterator listIterator()

public class Demo03Iterator {public static void main(String[] args) {//需求:定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马ArrayList<String> list = new ArrayList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒");list.add("沙僧");//Iterator<String> iterator = list.iterator();ListIterator<String> listIterator = list.listIterator();while(listIterator.hasNext()){String element = listIterator.next();if ("猪八戒".equals(element)){listIterator.add("白龙马");}}System.out.println(list);}
}

相关文章:

java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案

java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案 一. 什么时候会出现并发修改异常? 这里先看需求 : 定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马 很显然要求我们先创建一个集合并进行…...

BGP选路之Local Preference

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由的属性进行比较&#xff0c;以确定去往该目标网络的最优BGP路由。BGP首先比较的是路由信息的首选值&#xff08;PrefVal)&#xff0c;如果 PrefVal相同&#xff0c;就会比较本…...

WEB渗透信息收集篇--IP和端口信息

WEB渗透信息收集篇--域名信息-CSDN博客 WEB渗透信息收集篇--网站架构和指纹识别-CSDN博客 ​​​​​​​​​​​​​​WEB渗透信息收集篇--人员信息-CSDN博客​​​​​​​ WEB渗透信息收集篇--其他信息-CSDN博客 一、ASN ASN Tool - MxToolBox ASN通常指的是"自…...

国内微短剧系统平台抖音微信付费小程序app开发源代码交付

微短剧作为当下热门的内容&#xff0c;结合抖音平台的广泛用户基础&#xff0c;开发微短剧付费小程序APP具有显著的市场潜力&#xff0c;用户对于短剧内容的需求旺盛&#xff0c;特别是在言情、总裁、赘婿等热门题材方面&#xff0c;接下来给大家普及一下微短剧小程序系统。 顺…...

Java语言程序设计基础篇_编程练习题**15.19 (游戏:手眼协调)

**15.19 (游戏:手眼协调) 请编写一个程序&#xff0c;显示一个半径为10像素的实心圆&#xff0c;该圆放置在面板上的随机位置&#xff0c;并填充随机的顔色&#xff0c;如图15-29b所示。单击这个圆时&#xff0c;它会消失&#xff0c;然后在另一个随机的位置显示新的随机颜色的…...

学习记录day16—— 数据结构 双向链表 循环链表

双向链表 1、概念 1&#xff09;就是从任意一个节点既能存储其前驱节点&#xff0c;又能存储后继节点 2)结构体中增加一个指向前驱节点的指针 //定义数据类型 typedef int datatype;//定义节点类型 typedef struct Node {union {int len;datatype data;};struct Node *prio; …...

Air780EP模块 AT开发-MQTT接入OneNET移动物联网平台应用指南

应用概述 使用AT方式通过MQTT协议连接onenet studio。官网地址&#xff1a;https://open.iot.10086.cn/ 材料准备 Air780EP(V)开发板一套&#xff0c;包括天线SIM卡&#xff0c;USB线。 PC电脑&#xff0c;串口工具 在onenet上创建产品 打开OneNET官网&#xff0c;进入控制…...

HOST处理器预读PCI设备

在PCI&#xff08;Peripheral Component Interconnect&#xff09;总线规范中&#xff0c;MRL&#xff08;Memory Read Line&#xff09;和MRM&#xff08;Memory Read Multiple&#xff09;是两种读取存储器地址空间的总线事务类型。 MRL&#xff08;Memory Read Line&#xf…...

【Ansible】通过role角色部署lnmp架构

目录 一.roles概述 1.roles角色 2.roles的目录层次 2.1.roles 内各目录含义解释 二.实操 1.部署nginx 2.部署MySQL 3.部署php 4.编写测试文件 三.总结 一.roles概述 1.roles角色 可以把playbook剧本里的每个play看作为一个角色&#xff0c;将每个角色要用到的文件、…...

springboot给属性赋值的两种方式(yaml与properties)

一&#xff0c;介绍 在Spring Boot中&#xff0c;配置文件是用来设置应用程序的各种参数和操作模式的重要部分。Spring Boot支持两种主要类型的配置文件&#xff1a;properties文件和YAML 文件。这两种文件都可以用来定义相同的配置&#xff0c;但它们在格式和表达能力上有所不…...

20240725 每日AI必读资讯

&#x1f680;最强开源模型来了!Llama3.1以405B参数领先GPT-4o - Llama3.1以405B参数领先GPT-4o和Claude3.5Sonnet&#xff0c;在性能上实现超越。 - Meta大幅优化训练栈&#xff0c;扩展模型算力规模至16000个H100GPU&#xff0c;提高性能。 - Llama3.1具有上下文长度扩展、…...

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…...

大型语言模型的生物医学知识图优化提示生成

大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架&#xff0c;较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…...

winform datagrid 全部勾选

如果我们想要进行全选或全部取消&#xff0c;在数据较多的情况下&#xff0c;这种方法显然特别繁琐。怎么办呢&#xff1f; 当然是加以一个全选按钮了&#xff0c;选中全选按钮则全选&#xff0c;否则取消。笔者本想在红色圆圈位置添加全选复选框的&#xff0c;那样看起来更加…...

从 NextJS SSRF 漏洞看 Host 头滥用所带来的危害

前言 本篇博文主要内容是通过代码审计以及场景复现一个 NextJS 的安全漏洞&#xff08;CVE-2024-34351&#xff09;来讲述滥用 Host 头的危害。 严正声明&#xff1a;本博文所讨论的技术仅用于研究学习&#xff0c;旨在增强读者的信息安全意识&#xff0c;提高信息安全防护技能…...

LC617-合并二叉树

文章目录 1 题目描述2 思路优化代码完整输入输出 参考 1 题目描述 https://leetcode.cn/problems/merge-two-binary-trees/description/ 给你两棵二叉树&#xff1a; root1 和 root2 。 将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另…...

深入解析:端到端目标检测模型的奥秘

深入解析&#xff1a;端到端目标检测模型的奥秘 在人工智能领域&#xff0c;计算机视觉任务一直是研究的热点之一。目标检测作为计算机视觉中的核心问题&#xff0c;其重要性不言而喻。端到端的目标检测模型&#xff0c;以其高效的性能和简洁的架构&#xff0c;逐渐成为研究和…...

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题

每次要将表格中的数据分成多级时&#xff0c;只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格&#xff0c;分成了4级 步骤&#xff1a; 1、我们可以先按照这个层级设置下空列&#xff08;后买你会用到这个空列&#xff09; 二级不用加、三级前面加一列、四级前面加…...

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…...

怎么理解FPGA的查找表与CPLD的乘积项

怎么理解 fpga的查找表 与cpld的乘积项 FPGA&#xff08;现场可编程门阵列&#xff09;和CPLD&#xff08;复杂可编程逻辑器件&#xff09;是两种常见的数字逻辑器件&#xff0c;它们在内部架构和工作原理上有着一些显著的区别。理解FPGA的查找表&#xff08;LUT&#xff0c;L…...

Sqoop网络传输优化指南:从数据传输机制到带宽调优实战

Sqoop网络传输优化指南&#xff1a;从数据传输机制到带宽调优实战1. 引言&#xff1a;数据迁移的命脉在于网络2. Sqoop数据传输机制深度解析2.1 架构设计&#xff1a;基于MapReduce的并行传输2.2 导入数据的工作机制2.3 导出数据的工作机制2.4 网络交互的核心模式3. 优化网络带…...

FireRedASR-AED-L在软件测试中的应用:语音交互功能自动化测试

FireRedASR-AED-L在软件测试中的应用&#xff1a;语音交互功能自动化测试 你有没有想过&#xff0c;那些能听懂你说话的手机应用、智能音箱或者车载系统&#xff0c;它们的“听力”到底准不准&#xff1f;开发团队是怎么确保你每次说“播放音乐”或者“导航回家”&#xff0c;…...

ABAP - MEMORY ID 的跨程序数据共享实践

1. ABAP内存ID&#xff1a;跨程序数据共享的秘密武器 在SAP开发中&#xff0c;经常会遇到这样的场景&#xff1a;程序A需要某些数据&#xff0c;但获取这些数据的逻辑写在程序B里。传统做法可能是通过接口、数据库表或者文件来中转数据&#xff0c;但这些方法要么太麻烦&#x…...

42-西门子1200伺服控制5轴程序 程序采用1200系列PLC,项目实现以下功能: (1)

42-西门子1200伺服控制5轴程序 程序采用1200系列PLC&#xff0c;项目实现以下功能&#xff1a; &#xff08;1&#xff09;.三轴机械手联动取放料PTO脉冲定位控制台达B2伺服 &#xff08;2&#xff09;.台达伺服速度模式应用扭矩模式应用实现收放卷 &#xff08;3&#xff09;.…...

OpenCore Legacy Patcher终极指南:让你的老Mac焕发新生,体验最新macOS

OpenCore Legacy Patcher终极指南&#xff1a;让你的老Mac焕发新生&#xff0c;体验最新macOS 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为老旧的Mac无法升…...

MAX30102血氧传感器避坑指南:如何解决I2C信号干扰问题(附Arduino代码)

MAX30102血氧传感器实战&#xff1a;I2C信号干扰的深度解析与解决方案 当你在深夜调试MAX30102传感器时&#xff0c;突然发现心率数据频繁跳变——这可能是I2C信号干扰在作祟。作为一款高精度光学传感器&#xff0c;MAX30102在医疗级血氧监测和心率检测中表现出色&#xff0c;但…...

解决Redis测试环境搭建难题的try.redis工具:零配置交互式终端功能全解析

解决Redis测试环境搭建难题的try.redis工具&#xff1a;零配置交互式终端功能全解析 【免费下载链接】try.redis A demonstration of the Redis database. 项目地址: https://gitcode.com/gh_mirrors/tr/try.redis 在日常开发中&#xff0c;开发者常常面临Redis测试环境…...

【调试心法】别用 printf 谋杀你的系统了!打破“测不准”魔咒,用 C++ 与 DMA 构筑微秒级零开销异步观测者

摘要&#xff1a;在硬实时控制系统中&#xff0c;最可怕的 Bug 往往是薛定谔的 Bug——当你试图用 printf 去观察它时&#xff0c;观察行为本身产生的巨大延迟&#xff0c;就足以改变系统的物理运行轨迹。本文将无情揭露同步串口打印的耗时真相&#xff0c;批判阻塞式调试对高频…...

UPF实战:如何用set_isolation命令优化电源域隔离策略(附常见配置误区解析)

UPF实战&#xff1a;如何用set_isolation命令优化电源域隔离策略&#xff08;附常见配置误区解析&#xff09; 在复杂的SoC设计中&#xff0c;电源管理已成为芯片性能与可靠性的关键瓶颈。当工程师面对多电压域设计时&#xff0c;电源域隔离策略的优劣直接影响着芯片的静态功耗…...

Qwen3-ASR-0.6B WebUI实战:中文方言自动识别与结果导出操作

Qwen3-ASR-0.6B WebUI实战&#xff1a;中文方言自动识别与结果导出操作 1. 快速了解Qwen3-ASR-0.6B语音识别模型 Qwen3-ASR-0.6B是一个轻量级但性能强大的语音识别模型&#xff0c;专门为实际应用场景设计。这个模型只有6亿参数&#xff0c;但识别效果却相当出色&#xff0c;…...