HashMap并发修改异常解决办法
2017-04-20 19:18
477 查看
我在循环读取hashmap里的内容时,在循环中又在另外一个线程对hashmap进行修改,于是出现了如下这个异常
java.util.ConcurrentModificationException
翻译过来就是并发修改异常,上网找了下资料,解决方法如下:
调用HashMap的reomve方法时会出现 java.util.ConcurrentModificationException 。解决方法就是先用Iterator的方法remove,然后再调用HashMap的remove方法。即代码如下:
Iterator<Integer> keys = gradeMap.keySet().iterator();
while(keys.hasNext()) {
Integer i = keys.next();
i f(!gradesIds.contains(i)) {
keys.remove();
gradeMap.remove(i);
}
}
我加入这段代码之后,还是会出现该异常,于是继续寻找原因,发现了这样两段话:
1.如果你的程序是高并发,并且你的map是经常修改的,千万不要用HashMap,会把这个线常卡死的,要用ConcurrentHashMap
2.虽然HashTable和ConcurrentHashMap都是线程安全的,但是HashTable是同步容器,ConcurrentHashMap是并发容器,采用了锁分离策略,在并发环境中,应多使用ConcurrentHashMap,因为它具有非常好的并发性能,可以多个线程同时读写。而HashTable只能同时一个线程读写。
可以简单的把ConcurrentHashMap理解为多个HashMap组合,锁不是在ConcurrentHashMap上,而是在某个HashMap上。
注意:ConcurrentHashMap和HashMap的一个不同点就是ConcurrentHashMap里不能存放key和value为空的值。
于是我将Hashmap改为ConcurrentHashMap,经调试,解决了该问题。
java.util.ConcurrentModificationException
翻译过来就是并发修改异常,上网找了下资料,解决方法如下:
调用HashMap的reomve方法时会出现 java.util.ConcurrentModificationException 。解决方法就是先用Iterator的方法remove,然后再调用HashMap的remove方法。即代码如下:
Iterator<Integer> keys = gradeMap.keySet().iterator();
while(keys.hasNext()) {
Integer i = keys.next();
i f(!gradesIds.contains(i)) {
keys.remove();
gradeMap.remove(i);
}
}
我加入这段代码之后,还是会出现该异常,于是继续寻找原因,发现了这样两段话:
1.如果你的程序是高并发,并且你的map是经常修改的,千万不要用HashMap,会把这个线常卡死的,要用ConcurrentHashMap
2.虽然HashTable和ConcurrentHashMap都是线程安全的,但是HashTable是同步容器,ConcurrentHashMap是并发容器,采用了锁分离策略,在并发环境中,应多使用ConcurrentHashMap,因为它具有非常好的并发性能,可以多个线程同时读写。而HashTable只能同时一个线程读写。
可以简单的把ConcurrentHashMap理解为多个HashMap组合,锁不是在ConcurrentHashMap上,而是在某个HashMap上。
注意:ConcurrentHashMap和HashMap的一个不同点就是ConcurrentHashMap里不能存放key和value为空的值。
于是我将Hashmap改为ConcurrentHashMap,经调试,解决了该问题。
相关文章推荐
- java.util.ConcurrentModificationException ,遍历集合并同时修改集合,并发造成的异常解决办法
- 高并发读写导致ConcurrentModificationException异常的解决办法
- 并发修改异常原理与解决方法
- 并发修改异常的产生原因及解决方法
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常的解决办法
- ConcurrentModificationException 集合并发修改异常 解决
- 3、 006 并发修改异常产生及解决的2种方法
- ConcurrentModificationExeception :并发修改异常产生原因及解决方法
- 高并发 数据库操作比如插入,修改等解决办法
- 并发情况下修改数据对缓存的影响及解决办法
- [导入].Net中使用com组件后发生System.ArithmeticException异常的解决办法
- oracle修改计算机名后重启服务失败解决办法
- 异常 Underlying input stream returned zero bytes 解决办法
- SUSE Linux 修改了websphere 的编码格式为gbk后 对中文的支持也是有问题的解决办法
- win2003上传不能超过200k的解决办法(VBS脚本程序法,手动修改法)
- win2003上传不能超过200k的解决办法(VBS脚本程序法,手动修改法)-2006-6-24-1
- WEB站点使用企业库安全性异常解决办法
- 浏览网页注册表被修改之迷及解决办法
- 异常 Underlying input stream returned zero bytes 解决办法
- 向aspx的html代码页面拖拽自定义服务器控件出现“无效的Formatetc结构(异常来自HRESULT......)"错误解决办法