¿Cómo puede CopyOnWriteArrayList ser seguro para subprocesos?
He echado un vistazo aCódigo fuente de OpenJDK deCopyOnWriteArrayList
y parece que todas las operaciones de escritura están protegidas por el mismo bloqueo y las operaciones de lectura no están protegidas en absoluto. Según tengo entendido, bajo JMM todos los accesos a una variable (tanto de lectura como de escritura) deben estar protegidos por bloqueo o pueden producirse efectos de reordenamiento.
Por ejemplo,set(int, E)
El método contiene estas líneas (bajo bloqueo):
/* 1 */ int len = elements.length;
/* 2 */ Object[] newElements = Arrays.copyOf(elements, len);
/* 3 */ newElements[index] = element;
/* 4 */ setArray(newElements);
losget(int)
método, por otro lado, solo lo hacereturn get(getArray(), index);
.
En mi comprensión de JMM, esto significa queget
puede observar la matriz en un estado inconsistente si las declaraciones 1-4 se reordenan como 1-2 (nuevo) -4-2 (copyOf) -3.
¿Entiendo JMM incorrectamente o hay alguna otra explicación sobre por quéCopyOnWriteArrayList
es seguro para subprocesos?