Java 尽管使用同步块,HashMap ConcurrentModification 异常
Java HashMap ConcurrentModification Exception despite using synchronized block
我有一个 hashmap 同时用于多个线程。为了使其线程安全,我将其放入同步块中:
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
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$EntryIterator.next(HashMap.java:1476)
at java.util.HashMap$EntryIterator.next(HashMap.java:1474)
at myPackage.network.DeviceHandler.doClearing(DeviceHandler.java:51) // -> this line contains the for loop head of the code I showed
at java.lang.Thread.run(Thread.java:748)
如果每次访问(读取和写入)映射都是通过synchronized
块执行的,那么它将是线程安全的。
ConcurrentModificationException
地图在修改的同时迭代时会抛出
我建议您切换到 ConcurrentHashMap
,它是线程安全的,可以直接替代。
我有一个 hashmap 同时用于多个线程。为了使其线程安全,我将其放入同步块中:
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
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
at java.util.HashMap$EntryIterator.next(HashMap.java:1476)
at java.util.HashMap$EntryIterator.next(HashMap.java:1474)
at myPackage.network.DeviceHandler.doClearing(DeviceHandler.java:51) // -> this line contains the for loop head of the code I showed
at java.lang.Thread.run(Thread.java:748)
如果每次访问(读取和写入)映射都是通过synchronized
块执行的,那么它将是线程安全的。
ConcurrentModificationException
地图在修改的同时迭代时会抛出
我建议您切换到 ConcurrentHashMap
,它是线程安全的,可以直接替代。