¿Hay alguna diferencia entre una volatilereferencia de objeto y AtomicReferenceen caso de que solo use get()y set()-methods from AtomicReference?
java
concurrency
auramo
fuente
fuente

No no hay.
La potencia adicional que proporciona AtomicReference es el método compareAndSet () y sus amigos. Si no necesita esos métodos, una referencia volátil proporciona la misma semántica que AtomicReference.set () y .get ().
fuente
Hay varias diferencias y compensaciones:
El uso de un
AtomicReferenceget / set tiene la misma semántica JMM que un campo volátil (como indica el javadoc), peroAtomicReferencees un contenedor alrededor de una referencia, por lo que cualquier acceso al campo implica una búsqueda de puntero adicional .La huella de memoria se multiplica (suponiendo un entorno OOP comprimido, lo cual es cierto para la mayoría de las máquinas virtuales):
AtomicReference= 4b + 16b (encabezado de objeto 12b + campo de referencia 4b)AtomicReferenceofrece una API más rica que una referencia volátil. Puede recuperar la API para la referencia volátil utilizando unAtomicFieldUpdatero con Java 9 aVarHandle. También puedes alcanzarlo directamentesun.misc.Unsafesi te gusta correr con unas tijeras.AtomicReferencese implementa usandoUnsafe.Entonces, ¿cuándo es bueno elegir uno sobre el otro?
AtomicReference/AtomicFieldUpdater/Unsafedonde tiende a pagar en legibilidad y riesgo para su ganancia de rendimiento. Si esta no es un área sensible, simplemente busqueAtomicReference. Los escritores de bibliotecas suelen utilizar una combinación de estos métodos según los JDK específicos, las restricciones API esperadas, las restricciones de memoria, etc.fuente
El código fuente JDK es una de las mejores formas de responder a confusiones como esta. Si observa el código en AtomicReference, utiliza una variable de volatilidad para el almacenamiento de objetos.
Entonces, obviamente, si va a usar get () y set () en AtomicReference, es como usar una variable volátil. Pero como comentaron otros lectores, AtomicReference proporciona semántica CAS adicional. Por lo tanto, primero decida si desea la semántica de CAS o no, y si solo lo desea, use AtomicReference.
fuente
AtomicReferenceproporciona funcionalidad adicional que una variable volátil simple no proporciona. Como haya leído el Javadoc API, lo sabrá, pero también proporciona un bloqueo que puede ser útil para algunas operaciones.Sin embargo, a menos que necesite esta funcionalidad adicional, le sugiero que use un
volatilecampo simple .fuente
volatilecampo se puede usar como cualquier campo normal, mientras que para acceder al valor en un seAtomicReferencerequiere revisargetysetmétodos.A veces, incluso si solo usa gets y sets, AtomicReference puede ser una buena opción:
Ejemplo con volátil:
La implementación con AtomicReference le proporcionaría una sincronización de copia en escritura de forma gratuita.
Se podría decir que aún podría tener una copia adecuada si sustituye:
con:
Sin embargo, es más probable que alguien elimine el segundo accidentalmente en el futuro durante la "limpieza del código".
fuente