我在多个线程中同时使用了一个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
在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)
发布于 2020-03-31 19:01:10
只有在通过synchronized块执行对映射的每次访问(包括读写)时,它才是线程安全的。
当映射被修改时,ConcurrentModificationException将被抛出。
我建议您切换到一个线程安全的ConcurrentHashMap,这将是一个插入式替代。
https://stackoverflow.com/questions/60957836
复制相似问题