首页 > 程序开发 > 软件开发 > 其他 >

HashMap并发修改异常解决办法

2017-04-21

HashMap并发修改异常解决办法:我在循环读取hashmap里的内容时,在循环中又在另外一个线程对hashmap进行修改,于是出现了如下这个异常。

HashMap并发修改异常解决办法:我在循环读取hashmap里的内容时,在循环中又在另外一个线程对hashmap进行修改,于是出现了如下这个异常。
java.util.ConcurrentModificationException
翻译过来就是并发修改异常,上网找了下资料,解决方法如下:

调用HashMap的reomve方法时会出现 java.util.ConcurrentModificationException 。解决方法就是先用Iterator的方法remove,然后再调用HashMap的remove方法。即代码如下:

Iterator 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,经调试,解决了该问题。
相关文章
最新文章
热点推荐