¿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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta