繁体   English   中英

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

[英]Java HashMap ConcurrentModification Exception despite using synchronized block

我有一个同时在多个线程中使用的哈希图。 为了使其线程安全,我将其放入同步块中:

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)

如果对映射的每次访问(读取和写入)都通过synchronized块执行,则它才是线程安全的。

ConcurrentModificationException将在地图被修改时迭代时抛出。

我建议您切换到ConcurrentHashMap ,它是线程安全的,将是一个替代品。

暂无
暂无

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

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