У меня есть хэш-карта, используемая одновременно в нескольких потоках. Чтобы сделать его потокобезопасным, я поместил его в синхронизированный блок:
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)
at myPackage.network.DeviceHandler.doClearing (DeviceHandler.java:51) // - › эта строка содержит заголовок цикла for показанного мной кода
в java.lang.Thread.run (Thread.java:748)
mapConnections
? - person Joni   schedule 31.03.2020synchronized (mapConnections)
блоки? - person Joni   schedule 31.03.2020ConcurrentModificationException
. Что касается работы с другими объектами без синхронизации, да, это определенно проблема. Это не вызоветConcurrentModificationException
, но у вас будут ошибки, которые трудно понять и трудно воспроизвести. - person Joni   schedule 31.03.2020