执行代码是的时候,出现下面异常。
java.util.ConcurrentModificationException
at java.util.HashMap.forEach(HashMap.java:1291)
代码:
dataStatisticsByMSISDNMap.forEach((key, value)->{
// key存在
String result = deviceDataMap.computeIfPresent(key,biFunction);
// key不存在
if (result == null) {
deviceDataMap.computeIfAbsent(key,function);
}
// 処理後のデータを削除
dataStatisticsByMSISDNMap.remove(key);
});
然后百度了一下,发现原因如下:
Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。
大概意思就是遍历map的时候,不能更改map的数据。更改数据就会报错。除非用ConcurrentHashMap解决,保证数据安全。
给出的解决方案如下:
1) 通过Iterator修改Hashtable
while(it.hasNext()) {
Object ele = it.next();
it.remove();
}
2) 根据实际程序,您自己手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。
3) 使用“ConcurrentHashMap”替换HashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。
Map<String, String> map = new ConcurrentHashMap<String, String>();
map.putAll(param);
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
map.remove(key);
}
其中param就是调用类传入的map,把它转成ConcurrentHashMap,然后再进行循环操作。
---------------------
作者:左边的天堂
来源:CSDN
原文:https://blog.csdn.net/tiantang_1986/article/details/74289476
版权声明:本文为博主原创文章,转载请附上博文链接!