practice - threads java




La asignación de referencias es atómica, ¿por qué usar AtomicReference? (2)

Tengo una pregunta general simple sobre la referencia atómica.

¿Por qué usar AtomicReference si la asignación de referencia es atómica en java?

También me gustaría preguntar si la asignación de referencia es atómica en máquinas virtuales de 64 bits.

¿Necesitamos volatilidad para tener una referencia atómica atómica?


¿Por qué usar AtomicReference si la asignación de referencia es atómica en java?

Lo necesita cuando la decisión en la que se basa la creación del nuevo valor puede depender del valor anterior de la referencia. Por ejemplo, al implementar una estructura de datos similar a LinkedList, no se debe establecer la cabeza en un nuevo nodo que se refiera al nodo anterior. En el tiempo entre la lectura del nodo anterior y la configuración del encabezado al nuevo, otro hilo podría haber actualizado simultáneamente el valor de referencia del encabezado. Si nuestro hilo no fuera consciente de este cambio, se perdería.

¿Necesitamos volatilidad para tener una referencia atómica atómica?

La operación en sí se realizaría de forma atómica en el núcleo de la CPU que la ejecuta, pero no hay garantías de que los subprocesos de otros núcleos la detecten en la próxima lectura.


La razón es que aunque la referencia es atómica, es atómica en un sentido muy estrecho.

Si un subproceso escribe una referencia no volátil, lo que está garantizado es que otros subprocesos verán la escritura completa o no la verán en absoluto (sin desgarro de palabras)

Pero en ningún momento se garantiza que cualquier otro hilo lo verá ni que se vean en el mismo orden.

Una AtomicReference proporciona garantías mucho más sólidas (además de las operaciones CAS), esencialmente se comportan como volátiles:

  • Cualquier escritura que haya ocurrido en el hilo A antes de una escritura volátil es visible en el hilo B después de una lectura volátil posterior de esa variable
  • las operaciones volátiles no pueden ser reordenadas




concurrency