触发异常诱因
- 使用foreach进行遍历集合同时,对集合进行了增删操作,因此触发并发异常。
- 查阅资料发现使用 iterator进行遍历集合同时并进行进行遍历集合,也会触发此异常。
触发异常原因
- 查阅资料发现是foreach底层使用hashmap,由于hashmap的操作数据时未进行加锁操作,当数据出现并发操作时,以触发异常,具体底层原理略(可自行查阅资料了解)。
博主异常代码:使用foreach变量同时进行删除操作
List<OrderStatisticsResult> results =new ArrayList<>();
...
for(OrderStatisticsResult t:results){
if(t.getTime().equals(item)){
r = t;
Long after = r.getCount();
r.setCount(after+ x.getDocCount());
r.setTime(item);
//删除集合中的对象
results.remove(t);
}
}
解决方式
- 并foreach遍历替换成for循环遍历
- 先定义一个集合,将需要删除的对象放入集合中,待主循环遍历完成后,再一并从原集合中删除
List<OrderStatisticsResult> results =new ArrayList<>();
...
//定义一个集合
List<OrderStatisticsResult> removes =new ArrayList<>();
for(OrderStatisticsResult t:results){
if(t.getTime().equals(item)){
r = t;
Long after = r.getCount();
r.setCount(after+ x.getDocCount());
r.setTime(item);
// results.remove(t);
removes.add(t);
}
}
results.removeAll(removes);
3.自定义实现foreach底层HashMap替换成ConcurrentHashMap(ConcurrentHashMap底层实现了加锁机制),具体实现略(可自行查阅资料了解)。
…