繁体   English   中英

Java HashMap中的ConcurrentModificationException程序

[英]ConcurrentModificationException Program in java HashMap

码:

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创建新的实例,仍然抛出ConcurrentModificationException吗?

如何通过不使用ConcurrentHashMap进行修复?

感谢帮助 :)

原因是这样的:

  1. 通过在其构造函数中传递另一个hashmap( H2 ),可以创建一个新的hashmap( H1 )。
  2. 在H1的构造函数中,它尝试遍历H2的各个元素以对其进行添加。
  3. 在进行第2步的迭代时,其他一些线程修改了H2。 因此ConcurrentModificationException

不使用ConcurrentHashMap怎么解决?

  1. 做外部同步
  2. 使用复制正写的地图描述这里

但是我仍然建议您使用ConcurrentHashMap,除非您确实有自己的理由。

您根本无法(也不应)在另一个线程对其进行迭代时修改一个线程中的哈希映射。 在这种情况下,HashMap迭代器将抛出ConcurrentModificationException。 正如Java文档中明确提到的那样,这被称为迭代器的“快速失败”行为。 最好的解决方案是使用ConcurrentHashMap。 如果您不想使用该线程,则必须取消多线程。 正如吉姆指出的那样,如果您可以提供有关多线程的更多详细信息,则可能会得到更好的解决方案。 另外,为什么不想使用ConcurrentHashMap? 有什么特殊原因吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM