¿Hay alguna diferencia entre una volatile
referencia de objeto y AtomicReference
en 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
AtomicReference
get / set tiene la misma semántica JMM que un campo volátil (como indica el javadoc), peroAtomicReference
es 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)AtomicReference
ofrece una API más rica que una referencia volátil. Puede recuperar la API para la referencia volátil utilizando unAtomicFieldUpdater
o con Java 9 aVarHandle
. También puedes alcanzarlo directamentesun.misc.Unsafe
si te gusta correr con unas tijeras.AtomicReference
se implementa usandoUnsafe
.Entonces, ¿cuándo es bueno elegir uno sobre el otro?
AtomicReference
/AtomicFieldUpdater
/Unsafe
donde 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
AtomicReference
proporciona 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
volatile
campo simple .fuente
volatile
campo se puede usar como cualquier campo normal, mientras que para acceder al valor en un seAtomicReference
requiere revisarget
yset
mé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