Java HashMap ConcurrentModification Excepción a pesar de utilizar bloque sincronizado

Julien-100000:

Tengo un mapa hash utilizado en varios subprocesos al mismo tiempo. Para que sea más segura del hilo i ponerlo en un bloque sincronizado:

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);
        }
    }

Pensé que si lo puse en bloque sincronizado Yo no tengo que preocuparse por tales cosas, pero esta excepción se produce:

java.util.ConcurrentModificationException

en java.util.HashMap $ HashIterator.nextNode (HashMap.java:1442)

en java.util.HashMap $ EntryIterator.next (HashMap.java:1476)

en java.util.HashMap $ EntryIterator.next (HashMap.java:1474)

en myPackage.network.DeviceHandler.doClearing (DeviceHandler.java:51) // -> Esta línea contiene el bucle for cabeza del código mostré

en java.lang.Thread.run (Thread.java:748)

ᴇʟᴇvᴀтᴇ:

Sólo será seguro para subprocesos si cada acceso (tanto de lectura y escritura) para el mapa se realiza a través de un synchronizedbloque.

ConcurrentModificationException será lanzado cuando el mapa se itera mientras que se está modificando.

Yo sugeriría que cambie a una ConcurrentHashMapque es seguro para subprocesos y será una gota en el reemplazo.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=385859&siteId=1
Recomendado
Clasificación