ConcurrentModificationException异常

来源:百度知道 编辑:UC知道 时间:2024/06/28 10:54:55
用Spring定时器更新文章点击率时抛
public void updateArticleClick(){
Map<String,ArticleBean> map = ArticlePage.clickMap;
if(map == null){
map = new HashMap<String ,ArticleBean>();
return;
}
Set<String> mapKey = map.keySet();
for(String key : mapKey){
ArticleBean bean = map.get(key);
Article article = dao.get(Article.class, key);
if(article!=null&&bean!=null)
article.setClick(article.getClick()+bean.getClick());
}
map.clear();
}

是在Set<String> mapKey = map.keySet(); 出现异常
只是偶尔抛一下大部分时间都是正常的

HashMap:
public Set<K> keySet() {
Set<K> ks = keySet;
return (ks != null ? ks : (keySet = new KeySet()));
}

Hashtable:
public Set<K> keySet() {
if (keySet == null)
keySet = Collections.synchronizedSet(new KeySet(), this);
return keySet;
}
HashMap 换成Hashtable看看

你再用for(String key : mapKey)遍历时,如果对map进行了修改就会抛出此异常。如果需要在遍历的循环内部对map进行修改(如remove),可以用Enumeration enm = map.keys();
如果不需要可以用Hashtable、ConcurrentHashMap

有另一个线程在改写这个Map的内容