¿Esto significa que establecer una referencia NO es una operación atómica en sí misma?
Establecer una variable de referencia es atómica, pero una operación atómica no es necesariamente segura para subprocesos. Dejame explicar.
Atómico significa que cualquier observador (hilo) ve el valor anterior o el nuevo valor de la variable, y no algo más. No significa que todos los observadores ven el nuevo valor cuando miran la variable. (Y como @Tom señala, la atomicidad de la variable de referencia no dice nada sobre las propiedades de atomicidad del objeto al que hace referencia).
Para que todos los observadores vean el nuevo valor en la variable, debe haber alguna sincronización en marcha en. Para una actualización de una variable, esto sucederá si:
- la variable se declara como
volatile
, o
- acceso/cambios a la variable están sincronizadas por el mismo bloqueo del monitor primitiva.
Una variable que se envuelve en la clase correspondiente "AtomicXxx" también será seguro para subprocesos, aunque normalmente utiliza una de estas clases, si se quiere evitar bloqueos y que quiere hacer cosas tales como atómica "comparar y reemplazar".
De nuevo, esto solo se aplica a la seguridad de la hebra de la referencia del objeto. Si el estado del objeto no es también correctamente sincronizado, un hilo podría ver valores obsoletos para los atributos del objeto, etcétera.
Su ejemplo no es completamente seguro para subprocesos. Si la lista no se publica de forma segura, es posible que no lea los contenidos correctamente (aunque la implementación de 'LinkedList' puede permitirle salirse con la suya si está vacía). –
@Tom: ¿quiere decir que otros subprocesos pueden obtener un valor viejo en caché para el campo someList, o que el campo someList puede estar "medio escrito"? – radai
@ hatchetman82 Quiero decir que después de leer la nueva referencia, es posible que el objeto al que apunta no se haya actualizado por completo. Entonces, si fuera inseguro público 'nuevo java.awt.Point (1, 2)', podría leer el objeto en otro hilo, pero los campos 'x' y' y' pueden seguir siendo cero. –