【发布时间】:2023-04-09 19:37:01
【问题描述】:
代码:
Map<Integer,DealCountUpdater> dealCountMap=new HashMap<Integer,DealCountUpdater>();
public void update(){
for(Map.Entry<Integer, DealCountUpdater> e:new HashMap<Integer,DealCountUpdater>(dealCountMap).entrySet()){//line:58
System.out.println(e.hashCode());
}
}
当我运行这段代码时,得到以下异常:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$EntryIterator.next(HashMap.java:834)
at java.util.HashMap$EntryIterator.next(HashMap.java:832)
at java.util.HashMap.putAllForCreate(HashMap.java:435)
at java.util.HashMap.<init>(HashMap.java:225)
at org.my.tuan.count.CountUpdater.update(CountUpdater.java:58)
at org.my.tuan._Maintainer.run(TuanSched.java:110)
这一行是 CountUpdater.java:58 :
for(Map.Entry<Integer, DealCountUpdater> e:new HashMap<Integer,DealCountUpdater>(dealCountMap).entrySet()){
我在谷歌上搜索了这个程序,我知道我可以使用ConcurrentHashMap 而不是普通的HashMap,
但我想知道,我为什么要使用:
new HashMap<Integer,DealCountUpdater>(dealCountMap)
为HashMap创建新的Instance,还是抛出ConcurrentModificationException?
如何不使用ConcurrentHashMap 来解决它?
感谢您的帮助:)
【问题讨论】:
-
你漏掉了最重要的部分,也就是
//updating...代表的代码。我们不是通灵者。请将代码添加到帖子中。另外,您的程序是多线程的吗?是否有其他活动可以改变源映射? -
求帮助,这个异常在 CountUpdater.java:58 处抛出,这一行在:
for(Map.Entry<Integer, DealCountUpdater> e:new HashMap<Integer,DealCountUpdater>(dealCountMap).entrySet()){,我在我的问题中添加了它,//updating...无关紧要
标签: java multithreading java.util.concurrent