首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管使用同步块,但Java HashMap ConcurrentModification异常

尽管使用同步块,但Java HashMap ConcurrentModification异常
EN

Stack Overflow用户
提问于 2020-03-31 18:51:26
回答 1查看 227关注 0票数 2

我在多个线程中同时使用了一个hashmap。为了确保线程安全,我将其放入一个同步块中:

代码语言:javascript
复制
private final Map<Long, DeviceConnection> mapConnections = new HashMap()<>;

...

synchronized (mapConnections) {
        List<Long> toClear = new ArrayList<>();
        for (Map.Entry<Long, AndroidSocketConnection> entry : mapConnections.entrySet()) {
            if (entry.getValue().isReadyToRemove())) {
                removed++;
                toClear.add(entry.getKey());
            }
        }
        for(Long toC : toClear) {
            mapConnections.remove(toC);
        }
    }

我想如果我把它放到同步块中,我不需要关心这些东西,但是这个异常会被抛出:

java.util.ConcurrentModificationException

在java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)

在java.util.HashMap$EntryIterator.next(HashMap.java:1476)

在java.util.HashMap$EntryIterator.next(HashMap.java:1474)

在myPackage.network.DeviceHandler.doClearing(DeviceHandler.java:51) // -> 中,这一行包含了我向展示的代码的for循环头

在java.lang.Thread.run(Thread.java:748)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-31 19:01:10

只有在通过synchronized块执行对映射的每次访问(包括读写)时,它才是线程安全的。

当映射被修改时,ConcurrentModificationException将被抛出。

我建议您切换到一个线程安全的ConcurrentHashMap,这将是一个插入式替代。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60957836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档