for循环出现ConcurrentModificationException异常解决方法

文章描述了一种在多线程环境下,for循环遍历并修改列表时遇到的并发问题,作者尝试使用synchronized锁但未能解决问题。最终,通过改变遍历方式,从后往前遍历列表(i--),成功避免了并发冲突,虽然这种方法降低了效率。
摘要由CSDN通过智能技术生成

目录

报错图片

一、为什么会出现

二、解决过程

三、解决方法


报错图片

 

一、为什么会出现

可以看这篇博客,我就一一赘述了

为什么会出现

二、解决过程

一开始出现,看到别人都是因为迭代器一边遍历一边删除的问题 ,没有说for循环中出现

既然是多线程并发导致,我想着就加个synchronized锁不就完事了嘛,结果还是同样报错 

代码如下:

for (Object datum : resultData) {
                    synchronized (DengGanServiceImpl.class){
                        JSONObject o = (JSONObject) datum;
                        String device_code = o.getString("deviceSerial");
                        String onlineStatus = getStatusByDevice(device_code);
                        if (StringUtils.isNotEmpty(onlineStatus) && !"3".equals(onlineStatus)) {
                            o.put("online_status", onlineStatus);
                            resultData.add(o);
                        }
                    }
                }

于是就想到是否是锁加错了位置,就把锁移到了for循环的外面,还把锁里面的类换成this

synchronized (this) {
                    for (Object datum : resultData) {
                        JSONObject o = (JSONObject) datum;
                        String device_code = o.getString("deviceSerial");
                        String onlineStatus = getStatusByDevice(device_code);
                        if (StringUtils.isNotEmpty(onlineStatus) && !"3".equals(onlineStatus)) {
                            o.put("online_status", onlineStatus);
                            resultData.add(o);
                        }
                    }
                }

这就纯属是不懂原理,在这瞎试了

三、解决方法

就琢磨着既然是多并发问题,就说明是上一个遍历还没有做完动作,下一个遍历又开始了,造成这个原因,那就使用i--一个一个遍历,避免问题的发生

for (int i = resultData.size() - 1; i >= 0; i--) {
                    JSONObject o = (JSONObject) resultData.get(i);
                    String device_code = o.getString("deviceSerial");
                    String onlineStatus = getStatusByDevice(device_code);
                    if (StringUtils.isNotEmpty(onlineStatus) && !"3".equals(onlineStatus)) {
                        o.put("online_status", onlineStatus);
                        resultData.add(o);
                    }
                }

ok,问题解决了,就是速度有点慢,因为需要一个一个排队,先这样吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值