![](/img/trans.png)
[英]HashMap is not synchronized then why concurrentmodification exception
[英]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.