У меня есть хэш-карта, используемая в нескольких потоках одновременно. Чтобы сделать его потокобезопасным, я поместил его в синхронизированный блок:
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) // -> эта строка содержит заголовок для l oop кода, который я показал
at java .lang.Thread.run (Thread. java: 748)