¿Hay alguna diferencia entre una referencia de objeto y volatile
AtomicReference
en caso de que me acaba de utilizar get()
y set()
-Métodos de AtomicReference
?Java referencia volátil vs AtomicReference
Respuesta
respuesta corta es: No.
Desde el java.util.concurrent.atomic package doc:
Los efectos de memoria para accesos y actualizaciones de las atómicas generalmente siguen las reglas de volátiles:
get
tiene la memoria efectos de leer una variablevolatile
.set
tiene los efectos de memoria de escribir (asignar) una variablevolatile
.
Por cierto, el doc para el paquete es muy bueno y todo se explica ...
lazySet
(introducido en Java 6) es una operación más reciente introducido que tiene una semántica inalcanzables a través de volatile
variables; ver this post para más información.
No, no lo hay.
La potencia adicional proporcionada por 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().
AtomicReference proporciona funcionalidad adicional que una variable volátil no proporciona. Como ha leído la API, sabrá esto, 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 utilice un campo simple volátil.
Entonces, la diferencia está en Su desempeño. Si no hubiera diferencia, nunca recomendarías usar uno sobre el otro. –
El rendimiento es muy similar. Un AtomicRefrence agrega complejidad y uso de memoria. –
@BT Un campo 'volátil' se puede usar como cualquier campo regular, mientras que para acceder al valor en' AtomicReference' se debe pasar por los métodos 'get' y' set'. –
JDK source code es una de las mejores formas de responder a confusiones como esta. Si observa el código en AtomicReference, usa una variable volátil para el almacenamiento de objetos.
private volatile V value;
Así que, obviamente, si se va a utilizar sólo get() y set() en AtomicReference es como usar una variable volátil. Pero como comentaron otros lectores, AtomicReference proporciona semántica de CAS adicional. Entonces, primero decida si quiere semántica de CAS o no, y si solo usa AtomicReference.
* "El código fuente de JDK es una de las mejores formas de responder confusiones como esta" * => No necesariamente estoy de acuerdo, el javadoc (que es el contrato de la clase) es la mejor manera. Lo que encuentras en el código responde a la pregunta para una implementación específica, pero el código puede cambiar. – assylias
Por ejemplo [esta variable] (http://stackoverflow.com/a/14363501/829571) en hashmap era volátil en JDK 6 pero ya no es volátil en Java 7. ¿Ha basado su código en el hecho de que la variable era volátil, se habría roto al actualizar tu JDK ... Es cierto que el ejemplo es diferente, pero entiendes el punto. – assylias
hay varias diferencias y compensaciones:
Usando un
AtomicReference
get/set tiene el mismo semántica JMM como un campo volátiles (como los estados javadoc), pero elAtomicReference
es una envoltura alrededor de una referencia, por lo que cualquier acceso al campo implica una persecución de puntero adicional.La huella memoria se multiplica (asumiendo un entorno OOPs comprimido, lo cual es cierto para la mayoría de las máquinas virtuales):
- ref volátil = 4b
AtomicReference
= 4b + 16b (cabecera de objeto 12b + Campo 4b ref)
AtomicReference
ofrece una API más rica que una referencia volátil. Puede recuperar la API para la referencia volátil utilizandoAtomicFieldUpdater
, o con Java 9 aVarHandle
. También puede comunicarse directamente consun.misc.Unsafe
si le gusta correr con unas tijeras.AtomicReference
en sí se implementa utilizandoUnsafe
.
lo tanto, cuando es bueno elegir una sobre la otra:
- sólo necesitan obtener/poner? Quédese con un campo volátil, la solución más simple y la menor sobrecarga.
- ¿Necesita la funcionalidad adicional? Si se trata de una parte sensible del rendimiento (velocidad/sobrecarga de memoria) de su código, haga una elección entre
AtomicReference
/AtomicFieldUpdater
/Unsafe
donde tiende a pagar en legibilidad y riesgo para su ganancia de rendimiento. Si esto no es un área sensible, solo haga clic enAtomicReference
. Los escritores de bibliotecas suelen utilizar una combinación de estos métodos según los JDK específicos, las restricciones esperadas de la API, las limitaciones de memoria, etc.
- 1. ¿Es necesario declarar una AtomicReference como volátil?
- 2. Cuándo usar AtomicReference (Java)? ¿Es realmente necesario?
- 3. Boolean volátil vs AtomicBoolean
- 4. volátil vs mutable en C++
- 5. Cuándo usar volátil vs sincronización en multihilo en java?
- 6. Java volátil pregunta variables
- 7. matriz volátil Java?
- 8. AtomicReference en Java: ¿es necesario para establecer una referencia en un entorno seguro para subprocesos?
- 9. Asignación de referencia atómica multihilo de Java
- 10. Referencia Web vs. Servicio Referencia
- 11. es una variable volátil sincronizada? (java)
- 12. Modificador volátil Java y bloques sincronizados
- 13. Palabra clave volátil en Java - Clarificación
- 14. volátil para el tipo de referencia en .net 4.0
- 15. ¿Cómo puedo usar correctamente la palabra clave volátil en Java?
- 16. puntero vs. Referencia
- 17. Punteros inteligentes vs Referencia
- 18. AtomicReference a un objeto mutable y visibilidad
- 19. Uso del especificador volátil en C/C++/Java
- 20. conversión implícita: referencia constante vs referencia no const vs no es de referencia
- 21. pase de Java por referencia
- 22. Posible crear AtomicReference que se puede intercambiar atómicamente?
- 23. Volátil con sincronizados juntos
- 24. C++ 11: ¿Resumiendo sobre const, volátil, referencia de lval y punteros de función calificada de referencia de referencia de rvalue?
- 25. sobrecarga volátil?
- 26. DateTime volátil
- 27. Variable volátil
- 28. sqlalchemy id igualdad vs igualdad de referencia
- 29. ¿Cuándo utiliza exactamente la palabra clave volátil en Java?
- 30. ¿Por qué hacer un método volátil en Java?
Y la respuesta más larga sería? –
De acuerdo. Al menos necesitamos un enlace. –
El enlace para una respuesta más larga: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html –