Java Исключение HashMap ConcurrentModification, несмотря на использование синхронизированного блока - PullRequest
1 голос
/ 31 марта 2020

У меня есть хэш-карта, используемая в нескольких потоках одновременно. Чтобы сделать его потокобезопасным, я поместил его в синхронизированный блок:

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)

1 Ответ

2 голосов
/ 31 марта 2020

Это будет поточно-ориентированным, только если каждый доступ (и чтение, и запись) к карте осуществляется через блок synchronized.

ConcurrentModificationException будет выброшен, когда карта итерируется во время ее изменения.

Я бы посоветовал вам перейти на ConcurrentHashMap, который является поточно-ориентированным и будет заменой.

...