博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.util.ConcurrentModificationException的解决办法
阅读量:5208 次
发布时间:2019-06-14

本文共 1364 字,大约阅读时间需要 4 分钟。

  今天在使用iterator.hasNext()操作迭代器的时候,当迭代的对象发生改变,比如插入了新数据,或者有数据被删除。

编译器报出了以下异常:

Exception in thread "main" java.util.ConcurrentModificationException	at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)	at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:752)	at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:750)	at DBOperating.norStaticRelations(DBOperating.java:88)	at DBOperating.insertintoDB(DBOperating.java:79)	at Main.main(Main.java:51)

 例如以下程序:

import java.util.*;    public class Main  {  public static void main(String args[])  {  Main main = new Main();  main.test();  }    public void test()  {  Map aa = new HashMap();  a.put("1", "111");  aa.put("2", "222");  Iterator it = aa.keySet().iterator();  while(it.hasNext()) {  Map.Entry entry = (Map.Entry) it.next();              aa.remove(ele);    //此处报错 }  System.out.println("运行成功!");  }  }

  

分析原因:Iterator做遍历的时候,HashMap被修改(aa.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。

 

解决办法:

1) 通过Iterator修改Hashtable

while(it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
            it.remove();
}

2) 根据实际程序,您自己手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。

3) 使用“ConcurrentHashMap”替换HashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。

 

 

转载于:https://www.cnblogs.com/wangkundentisy/p/6659321.html

你可能感兴趣的文章
递归-下楼梯
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
Azure Iaas基础之---创建虚拟机
查看>>
不错的MVC文章
查看>>
网络管理相关函数
查看>>
IOS Google语音识别更新啦!!!
查看>>
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>
BootScrap
查看>>
[大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
查看>>
HTML&CSS常见问题整理(五)
查看>>
Intellij idea
查看>>
WEB_点击一百万次
查看>>
word20161228
查看>>
CodeForces - 878A Short Program(位运算)
查看>>
Mysql聚簇索引和非聚簇索引
查看>>
Hive入门之UDFS函数
查看>>
python文件操作笔记
查看>>