java HashMap中的ConcurrentModificationException程序

发布于 2024-10-18 20:49:26 字数 1408 浏览 2 评论 0原文

代码:

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 来修复它?

感谢您的帮助:)

code:

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());
    }
}

when I run this code,get below exception:

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)

this line is CountUpdater.java:58 :

for(Map.Entry<Integer, DealCountUpdater> e:new HashMap<Integer,DealCountUpdater>(dealCountMap).entrySet()){

I google this program,I know I can using a ConcurrentHashMap instead of a plain HashMap,

but I want to know ,why I using :

new HashMap<Integer,DealCountUpdater>(dealCountMap)

to create new Instance for HashMap,still throw ConcurrentModificationException ?

how to fix it by not using ConcurrentHashMap ?

thanks for help :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小苏打饼 2024-10-25 20:49:26

原因是这样的:

  1. 您通过在其构造函数中传递另一个哈希图(H2)来创建一个新的哈希图(H1)。
  2. 在 H1 的构造函数中,它尝试迭代 H2 的元素,以添加自身。
  3. 当步骤 2 中的迭代正在进行时,其他一些线程修改了 H2。因此ConcurrentModificationException

不使用ConcurrentHashMap如何解决?

  1. 进行外部同步
  2. 使用复制写入映射,如此处< /a>.

但我仍然建议使用 ConcurrentHashMap,除非你确实有你的理由。

The reason is this:

  1. You create a new hashmap(H1) by passing another hashmap(H2) in its constructor.
  2. In the constructor fo H1, it tries to iterate through elements of H2, to add in itself.
  3. While the iteration in step 2 is going on, some other thread modifies H2. Hence ConcurrentModificationException.

How to solve it without using ConcurrentHashMap?

  1. Do external synchronization
  2. Use a copy-n-write map as described here.

But I would still suggest using ConcurrentHashMap, unless you really have your reasons.

对你再特殊 2024-10-25 20:49:26

当另一个线程正在迭代它时,您根本不能或不应该在线程中修改哈希图。在这种情况下,HashMap 迭代器将抛出 ConcurrentModificationException。这称为迭代器的“快速失败”行为,java 文档中明确提到了这一点。最适合您的解决方案是使用 ConcurrentHashMap。如果你不想使用那个,那么你必须取消多线程。正如吉姆指出的那样,如果您可以提供有关多线程的更多详细信息,那么您可能会得到更好的解决方案。另外,为什么你不想使用ConcurrentHashMap?有什么特别的原因吗?

You simply cannot,or should not, modify a hashmap in a thread while another thread is iterating over it. In such cases, the HashMap iterator will throw a ConcurrentModificationException. This is called 'fail-fast' behaviour of iterators as it is clearly mentioned in the java docs. The best solution for you is to use ConcurrentHashMap. If you don't want to use that one, then you have to do away with the multi-threading. As jim pointed out, if you can give more details about your multi-threading then you might get a better solution. Also, why do you want to NOT use ConcurrentHashMap? Any particular reason?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文