您的位置:首页 > 其它

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,经调试,解决了该问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐