使用多线程出现: java.util.ConcurrentModificationException的问题。

多线程java.util.ConcurrentModificationException异常问题分析和处理 多线程java.util.ConcurrentModificationException异常问题分析和处理 在Java中,多线程和Map使使用频率最高的两兄弟了,今天突然被刚入职不久的同事问到,多线程处理Map时会偶尔报异常,直接看代码 import java.util.Collections; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import java.util.concurrent.*; 阅读详情

     在一个批量Insert业务中,使用多线程进行约束insert。其中出现的一个问题。

     部分数据是成功insert的。 百度得知此问题发生的原因是:在循环迭代中,如果对Vetor、ArrayList进行修改,就可能对抛出这个异常。仔细错误检查代码:entryList的作用域过大,并且,在后面做了entryList.clear的操作。对象还是那个对象,只是把里面的元素清空了而已。

仔细错误检查代码


                    List<InStorageMissionEntry> entryList = new ArrayList<InStorageMissionEntry>();
                    for (String billno : fbillnos) {
                        InStorageMission mission = setMission(user);
                        //entryList = new ArrayList<InStorageMissionEntry>();
                        for (PurReceiveOrder purReceiveOrder : purReceiveOrderList) {
                            
                            String fbillno = purReceiveOrder.getFbillno();
                            if(billno.equals(fbillno)) {
                               
                                mission.setRecOrgId(purReceiveOrder.getRecOrgId());
                                mission.setRecOrgNumber(purReceiveOrder.getRecOrgNumber());
                                
                               
                                InStorageMissionEntry setEntry = setEntry(user,purReceiveOrder);
                                entryList.add(setEntry);
                                
                                Integer Fid = purReceiveOrder.getfId();
                                Map<String,Integer> map = new HashMap<String, Integer>();
                                
                                map.put("billId", Fid);
                                map.put("entryId", purReceiveOrder.getEntryId());
                                map.put("missionStatus", 3);
                                mapList.add(map);
                            }
                        }
                        System.out.println("entryList====="+entryList.size());
                        if(mission!=null && entryList !=null && entryList.size()>0) {
                            try {
                                synchronized (this) {
                                    inStorageMissionService.insertInStorageMission(mission, entryList);
                                    msg = new Msg();
                                    msg.setCode(100);
                                    msg.setMsg("");
                                    msg.setObject(mission);
                                    msgList.add(msg);
                                    mission=null;
                                    entryList.clear();
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                return Msg.defineFail("")+"";
                                
                            }
                        }
                    }

 
       修改后的正确代码应该是:

  
                    List<InStorageMissionEntry> entryList =null;
                    for (String billno : fbillnos) {
                        InStorageMission mission = setMission(user);
                        entryList = new ArrayList<InStorageMissionEntry>();
                        for (PurReceiveOrder purReceiveOrder : purReceiveOrderList) {
                            
                            String fbillno = purReceiveOrder.getFbillno();
                            if(billno.equals(fbillno)) {
                              
                                mission.setRecOrgId(purReceiveOrder.getRecOrgId());
                                mission.setRecOrgNumber(purReceiveOrder.getRecOrgNumber());
                                
                           
                                InStorageMissionEntry setEntry = setEntry(user,purReceiveOrder);
                                entryList.add(setEntry);
                                
                                Integer Fid = purReceiveOrder.getfId();
                                Map<String,Integer> map = new HashMap<String, Integer>();
                                
                                map.put("billId", Fid);
                                map.put("entryId", purReceiveOrder.getEntryId());
                                map.put("missionStatus", 3);
                                mapList.add(map);
                            }
                        }
                        System.out.println("entryList====="+entryList.size());
                        if(mission!=null && entryList !=null && entryList.size()>0) {
                            try {
                                synchronized (this) {
                                    inStorageMissionService.insertInStorageMission(mission, entryList);
                                    msg = new Msg();
                                    msg.setCode(100);
                                    msg.setMsg("成功");
                                    msg.setObject(mission);
                                    msgList.add(msg);
                                    mission=null;
                                    //entryList.clear();
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                return Msg.defineFail("错误")+"";
                                
                            }
                        }
                    }

      在第一次for循环中,重新new了一个entryList,这是个全新的entryList,同时不用再使用entryList.clear()对其清空。因此就不存在修改了ArrayList。

总结:

      代码简介之美还得多学学,多看看啊。虽然java的GC机制帮我们做了很多垃圾回收工作,但是在程序中也应该尽量慎重选择对象的作用域。作用域能小则小,过了那个作用域,对象的引用为空了,GC就对其进行回收,内存的堆区不必因为存在太多对象而占用内存。


                 

java 并发编程中的ConcurrentModificationException 异常问题 云渲染服务中的 java.util.ConcurrentModificationException 异常问题 针对最近云渲染服务中的出现的一个问题进行反思与回顾 回调视频渲染进度问题 在修改过回调进度的 url 后,启用了之前的代码片段。导致之前的漏洞被爆出:在多线程编程中,直接使用 hashmap 来保存当前的渲染任务,而不进行一些必要的线程间的互斥与同步操作,导致在一个线程通过迭代器遍历 hashmap 时,另一个线程同时修改 hashmap,导致程序抛出 java.util.Concurrent 阅读详情

相关推荐

Win64 驱动内核编程-16.WFP网络监控驱动(防火墙)

WFP驱动监控网络 WFP是微软推出来替代TDIHOOK、NDISHOOK等拦截网络通信的方案,WFP的框架非常庞大,在RING3和RING0各有一套类似的函数,令人兴奋的是,即使在R3使用WFP,也可以做到全局拦截访问网络。由于WFP的范围太广,实在难以一言概括,感...

墨鱼菜鸡 1033

为什么会出现ConcurrentModificationException异常,如何解决?

在前面一篇文章中提到,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。 1、异常出现的原因 先看下面这段代码: public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList

掘客DIGGKR 2952

用AT7456E给监控摄像头加OSD?5步搞定时间水印和Logo叠加

本文详细解析了如何使用AT7456E视频字符叠加芯片为监控系统添加专业级OSD功能,涵盖硬件设计、字符库编程和系统集成等关键步骤。通过5步操作实现时间水印和Logo叠加,提升监控系统的可用性和专业性,特别适合安防和工业视觉应用。

sea99的博客 1012

[报错信息] : java.util.ConcurrentModificationException - Java集合操作出现

前言 List集合操作时有时候会出现 java.util.ConcurrentModificationException,翻译过来就是并发修改异常. 先看Java API 中对于ConcurrentModificationException是如何介绍的. 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 多线程操作时出现 : 某个线程在 Collection 上进行迭代时,通常不允...

Clearlight's Blog 1064

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

SAP 批量修改 工艺路线 和 BOM

1、在运维的过程中经常会遇到用户需要批量更改组件,或者是批量更改数量,还是组件里面的一些标识,当处理这些批量数据处理的业务时,BOM的批量更改一个想到的就是CS20,但是CS20当BOM需要替换的时候就不是很适用。当前工作区域:选择 SAP_ITEM 对BOM行项目进行变更,工艺路线也是可以批量更改的,根据实际的业务进行选择,我这里选择的就是BOM的组件变更。5、本博客将使用新的一种方式进行BOM的批量变更,标准的事务代码:CEWB对BOM进行批量更改。3、使用LSMW的方式进行BOM的批量更改。

我小时候很黑的博客 4098

ArrayList引起的ConcurrentModificationException 异常原因及解决方法

ArrayList引起的ConcurrentModificationException 异常原因及解决方法

lhl6688的专栏 4163

智能车图像处理4-入门级分析3 ---十字路口补线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 1万+

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

通过错误提示,知道了异常出现在checkForComodification这个方法上,异常原因是modCount!在网上查询得知,在很多容器中,都有一个变量记录你从结构上修改此容器的次数,叫做modCount,查看ArrayList的add()和remove()方法就可以发现,每次你调用add方法()向容器里面增加了一个元素,或者你调用Remove()方法删除了其中的某个元素,这个值都会增加1。

LYQ 6719

LLM评测框架Ragas:测试RAG的性能出现TimeoutError()的解决办法(Ragas+langchain+ollama)

无奈之下,自己找到了一个解决办法,在ragas支持的llm类库中加了一个如下的类,支持ollama、langchian_ollama使用ragas测试报错的问题。可以将如上的库放到你的ragas的系统库的llms目录下,然后修改__init__.py如下。最近用ragas测试rag的性能,发现老出现TimeoutError()的错误。这是一个临时的解决办法,具体等待官方给出最终的解决方案。后来发现官方也没有尽快支持的计划。然后就可以用如下代码进行一些验证。

Criss@陈磊 666

ollama如何在自己的服务器上跑Qwen3(小白必看)

在国内下载ollama最新安装包时,使用curl -fsSL https://ollama.com/install.sh | sh命令可能会遇到网络问题导致下载进度停滞。为了解决这一问题,可以通过国内的镜像源进行下载,例如使用modelscope社区提供的最新ollama镜像仓库。具体步骤包括:首先通过pip install modelscope安装modelscope,然后使用modelscope download命令下载ollama-linux镜像,接着进入下载目录并赋予安装脚本执行权限,最后运行安装脚

Ven%的博客 756

java clone线程_多线程下java.util.ConcurrentModificationException问题解决

多线程同时增加和获取数据的情况:import java.util.ArrayList;import java.util.List;public class Main {public static void main(String[] args) {new Main().test();}private List mData = new ArrayList<>();private List...

weixin_34980267的博客 229

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【JAVA开发日常问题】三、多线程遍历集合报错java.util.ConcurrentModificationException: null

一、问题出现 突然发现线上某段代码报错,报错内容Unhandled exception caught java.util.ConcurrentModificationException: null 二、问题分析 1. 网上了找了些文章,关于这个错误的解释java.util.ConcurrentModificationException 异常原因和解决方法,大概了解到对集合元素遍历的时候删除或者新增会导致这个异常<font color=red>迭代器的modCount和expectedM

后端研发工程师Marion的博客 1433

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java.util.ConcurrentModificationException 异常问题详解

java.util.ConcurrentModificationException 异常问题详解

mhx123456789的博客 73

java.util.ConcurrentModificationException subList问题原因

自己编写一个获取List子集的一个函数,但是在多线程的情况下,会报java.util.ConcurrentModificationException subList错误。 [code="java"]public static List getSubList(List inputlist, int beginIndex,int endIndex){ List result = null; ...

wnan1981的专栏 454

java.util.ConcurrentModificationException

java.util.ConcurrentModificationException at java.util.AbstractListItr.checkForComodification(UnknownSource)atjava.util.AbstractListItr.checkForComodification(Unknown Source) at java.util.AbstractList...

qq_45110312的博客 147

java.util.ConcurrentModificationException错误

用foreach遍历容器时,即便是单线程,如果容器被改变,则会抛出java.util.ConcurrentModificationException。 所以在做WEB开发或者多线程开发的时候,一定要注意static的容器对象。

lian_zhihui1984的专栏 806

多线程并发变量问题

背景 ​ 在Gnss功耗优化的项目中我们需要给其他模块提供一个接口,即我们Imp类中的功耗信息,但是我们功耗信息会在每次上传之后就进行了删除操作,因此就出现了多线程并发操作变量的情况,至此记录如下; 情景再现 ​ 我模拟了一下项目中会出现的情况代码如下: public static List<Integer> list = new ArrayList(); public static void main(String[] args) { for (int i = 0;

Grekit_Sun的博客 455

android上java.util.ConcurrentModificationException 解决方案

解决方案]:由于迭代对象不是线程安全,在迭代的过程中,会检查modCount是否和初始modCount即expectedModCount一致,如果不一致,则认为数据有变化,迭代终止并抛出异常。常出现的场景是,两个线程同时对集合进行操作,线程1对集合进行遍历,而线程2对集合进行增加、删除操作,此时将会发生ConcurrentModificationException异常。该异常表示迭代器迭代过程中,迭代的对象发生了改变,如数据项增加或删除。

caizhihong的专栏 1673

Java ConcurrentModificationException异常原因和解决方法

,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。   以下是本文目录大纲:   一.ConcurrentModificationException异常出现的原因   二.在单线程环境下的解决办法   三.在多线程环境下的解决

ballack512的专栏 415
上一篇: 记一次对HashSet浅薄的理解
下一篇: 线程基础一
青蛙一个人在家
博客等级 码龄9年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值