为什么会出现 java.util.ConcurrentModificationException 异常?

java.util.ConcurrentModificationException异常分析及解决 在开发的过程中,我们经常会对集合中的元素进行操作,改变集合的内容可能会产生ConcurrentModificationException异常,本文对该异常进行详细的分析。 可能一些同学看到过fail-fast或者fail-safe的概念,如果不了解的可以点击: fail-fast(快速失败)和fail-safe(安全失败) ConcurrentModificationExcept... 阅读详情

http://www.javaeye.com/topic/124788

 

http://www.cnblogs.com/iloveu/archive/2009/06/23/1509385.html

 

当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行,   java .util .ConcurrentModificationException 异常也将被抛出。

   Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭 代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java .util .ConcurrentModificationException 异常。

  所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

  有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.

1   import  java.util. * ;  
2  
3   public   final   class  MyTest  
4  {  
5       private   static  HashMap p_mapList  =   new  HashMap( 2 );  
6       private  MyTest(){}  
7       public   static   void  init(){  
8           //  If only there are more than one element in Map,  
9           //  the ConcurrentModificationException will not be
10           //  thrown.
11           p_mapList.put( new  String( " hello " ), new  String( " world " ));  
12           p_mapList.put( new  String( " goto " ), new  String( " hell " ));  
13       }  
14       public   static   void  clear()  throws  Exception{  
15           Iterator pTmpKeys  =   null ;  
16           Long pTmpKeyLong;  
17           pTmpKeys  =  p_mapList.keySet().iterator();  
18           String pCurKey  =   null ;  
19           String pCurObj  =   null ;  
20           while (pTmpKeys.hasNext()){  
21               pCurKey  =  (String) pTmpKeys.next();  
22               pCurObj  =  (String) p_mapList.get(pCurKey);  
23  
24               p_mapList.put(pCurKey, null );  
25               //  You can not remove element in Map object directly.
26               // p_mapList.remove(pCurKey);
27               //  But you can remove current element by iterator itself.
28               pTmpKeys.remove();  
29  
30               System.out.println(pCurKey  +   "  removed. " );  
31           }  
32           System.out.println(p_mapList.size()  +    
33                               "  entries left after iterator. " );  
34           pTmpKeys  =   null ;  
35       }  
36       public   static   void  main(String[] args)  
37                                    throws  Exception{  
38           MyTest.init();  
39           MyTest.clear();  
40       }  
41  } 
ArcGIS小白必看:5分钟搞定shp矢量文件分割(附常见错误排查) 本文为ArcGIS新手详细解析了分割shp矢量文件的四种核心方法:裁剪工具、分割工具、按属性选择导出及ArcPy脚本自动化。重点强调了投影匹配等关键步骤,并提供了常见错误排查指南,帮助用户快速掌握矢量数据分割技巧,提升GIS数据处理效率。 阅读详情

相关推荐

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 415

ConcurrentModificationException异常原因和解决方法

首先看一下一个例子举出 ConcurrentModificationException 的出现场景: public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(){ { add(1); add(2); add(3); } }; Iterator&

qq_44613591的博客 9万+

【光学仿真】基于Matlab的LG/BG/PV/HG光束生成与特性分析【附完整源码】

本文详细介绍了如何使用Matlab进行拉盖尔-高斯(LG)、贝塞尔-高斯(BG)、完美涡旋(PV)和厄米-高斯(HG)四种特殊光束的仿真与特性分析。通过提供完整的Matlab源码,手把手指导读者生成光束、分析其强度、相位、传播特性及轨道角动量,为光学研究、激光应用及教学提供了直观高效的数值实验平台。

3a9bq4r8t2y的博客 492

Java ConcurrentModificationException 异常分析与解决方案

一、单线程 1. 异常情况举例     只要抛出出现异常,可以肯定的是代码一定有错误的地方。先来看看都有哪些情况会出现ConcurrentModificationException异常,下面以ArrayList remove 操作进行举例: 使用的数据集合: List myList = new ArrayList(); myList.add

Android 3万+

LaTeX参考文献格式apsrev4-1,增加文献标题

APS的LaTeX参考文献格式apsrev4-1是隐藏标题的,如果想要出现标题,需要更改apsrev4-1.bst文件内容 在apsrev4-1.bst文件靠后部分,定义不同类型文献格式的地方,将article类型的内容替换为, FUNCTION {article} { output.bibitem format.authors booktitle empty$ { "author" output.check }{ output } if$ author format.

loading1234567的博客 5031

独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

独创改进🚀! | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

Coding... 2211

ConcurrentModificationException异常原因,解决方法,线程安全的单例模式

ConcurrentModificationException(并发修改异常)是基于java集合中的 快速失败(fail-fast) 机制产生的,在使用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了增删改,就会抛出该异常。快速失败机制使得java的集合类不能在多线程下并发修改,也不能在迭代过程中被修改。在线程安全的几种单例中。

Rose J 的博客 7961

【WRF数据介绍第二期】气象驱动场数据介绍及下载

【WRF数据介绍第二期】气象驱动场数据介绍及下载

WW、forever的博客 2160

ConcurrentModificationException异常

一:ConcurrentModificationException异常: 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 二:遍历list集合时删除元素出现的异常 public static void main(String[] args) { ArrayList&lt;String&gt; list=new ArrayList&lt;String&gt;(); ...

小礼貌的博客 9万+

网络工程师教程第6版(2024年最新版)

本书 根据《网络工程师考试大纲》(2024年审定通过)编写,对网络工程师岗位所要求的主要知 识及应用技术进行了阐述。本书主要内容包括数据通信、局域网、无线通信网、网络互连、网络安全、网络操作系统与应用服务器、组网技术、网络管理、网络规划和设计。本书是参加网络工程师考试的必备教材,也可作为网络工程从业人员学习网络技术的教材或日常工作的参考用书。王涛和严体华编写了第2章、第3章和第4章;网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。

鹿鸣天涯 6904

(6)APB总线协议 —— 逻辑梳理(0.1认知)

这篇大家就差不多看看就行

CAUC_learner的博客 2702

java.util.ConcurrentModificationException: null 报错解决

ConcurrentModificationException报错解决及相应的List知识扩展

qq_51741039的博客 3万+

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3951

java.util.ConcurrentModificationException异常出现的原因及解决方法

增强for循环 遍历列表时会调用 checkForComodification() 方法检查当前列表是否有并发修改,如果有则会抛出 java.util.ConcurrentModificationException 异常。

晴空๓ 2995

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java异常:Java.util.ConcurrentModificationException异常处理

在开发中使用了迭代器对 List 进行遍历,遇到了java.util.ConcurrentModificationException报错,本文记录了这个错误出现的原因和如何解决。

qq_46119575的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java.util.ConcurrentModificationException异常解决方法

java.util.ConcurrentModificationException异常(转) 1、 今天在写一个带缓存功能的访问代理程序时出现了java.util.ConcurrentModificationException异常, 因为该异常是非捕获型异常而且很少见,所以费了些时间才找到问题所在,原来在通过Iterator进行遍历的时候,如果直接对HashMap进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示其HashMap已经被修改。 源程序代码片段如下:caches为一个Has

weixin_44732049的博客 6219

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java.util.ConcurrentModificationException异常原因及解决方法

java.util.ConcurrentModificationException异常原因及解决方法 在项目中对List进行remove操作时报错java.util.ConcurrentModificationException 代码块: public static void main(String args[]) { Long id=Long.valueOf(200); ...

qq_25065295的博客 655

Android并发修改异常:java.util.ConcurrentModificationException

Android并发修改异常:java.util.ConcurrentModificationException 1.异常原因: 网上很多出现并发修改异常的情况都是和集合有关,而我的情况是在将Activity清除出栈的时候出现的异常,其他的情况暂未遇到,碰到再更新。 2.分析解决: 我在之前的《如何在本Activity页面退出后回到首页或者指定的Activity入口》中提到会出现并发修改异常的情况:我从A 主页--> B--> C--> D 页面,当想结束当前页面,直接回到A页面时...

凌燕的专栏 865

Java - java.util.ConcurrentModificationException 异常原因及解决方法

Java - java.util.ConcurrentModificationException 异常原因及解决方法

3767

java.util.ConcurrentModificationException异常处理

对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常 Caused by: java.util.ConcurrentModificationException eg: ArrayList mWidgets = new ArrayList; mWidgets.add(

Picasso_L的专栏 1203

java.util.ConcurrentModificationException异常

如果在某个迭代器修改集合时,另一个迭代器对其进行遍历,就一定会出现状况。例如,一个迭代器指向另一个迭代器刚刚删除的元素前面,现在这个迭代器就是无效的,并且不应该再使用。 如果迭代器发现它的集合被另一个迭代器修改了,或是被该集合自身的方法修改了,就会抛出一个java.util.ConcurrentModificationException异常,例如: public class LinkedLis...

qq_38844728的博客 186

Kotlin/Java HashMap异常:java.util.ConcurrentModificationException

Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2,而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2,而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。此方法返回一个线程容量为n的线程池。读时候快,写/删/改慢。

Zhang Phil 1297

java.util.ConcurrentModificationException 异常问题详解

java.util.ConcurrentModificationException 异常问题详解 环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常,本文就以ArrayList为例去理解和解决这种异常。 一、单线程情况下问题分析及解决方案 1....

猪之仆的博客 261
下一篇: ConcurrentModificationException主要原因及处理方法
wangwangbinbin
博客等级 码龄20年 7粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值