目录
报错图片
一、为什么会出现
可以看这篇博客,我就一一赘述了
二、解决过程
一开始出现,看到别人都是因为迭代器一边遍历一边删除的问题 ,没有说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,问题解决了,就是速度有点慢,因为需要一个一个排队,先这样吧