¿Lo mismo para todos los demás objetos atómicos? Es más fácil explicar la pregunta para un AtomicInteger. Dado que más de 1 hilo está accediendo a la referencia a myInt, ¿no es posible que un hilo vea el valor almacenado en caché, por ejemplo nulo, para este objeto, a menos que también se declare volátil? Si no, ¿por qué?¿Es necesario declarar una AtomicReference como volátil?
Respuesta
No solo no es necesario, sino que es semánticamente incorrecto. AtomicReference
contiene la referencia "real" dentro de sí mismo, y gestiona el acceso a ella utilizando sus propias construcciones de sincronización. Las propias construcciones de sincronización de la JVM (synchronized
, volatile
, etc.) y no se utilizan. El objeto AtomicReference
en sí mismo no debe tratarse como volátil. En todo caso, considere hacerlo final
.
Considere también this question - volatile
puede considerarse una alternativa al uso de AtomicReference
, si todo lo que necesita es obtener y configurar operaciones.
¿Por qué no? Un mapa concurrente bien podría ser retenido por un campo volátil por razones legítimas, y no veo por qué esto no debería ser cierto para los objetos "atómicos". –
@Enno: Claro, supongo que podrías inventar un escenario donde sea apropiado. Sin embargo, si vieras 'Volátil AtomicReference' en el código, seguramente no sería lo que el autor pretendía. – skaffman
@skaffman: Claro que AtomicReferance contiene la referencia real al objeto objetivo dentro de sí mismo, pero me refiero a la referencia a este objeto AtomicReference. Pero de hecho puedo hacerlo definitivo, y tiene mucho sentido también. ¡Gracias! –
Los objetos "atómicos" no son inmutables, por lo que solo deben protegerse con hilos si se publican correctamente. Por ejemplo, cuando haces algo como esto, necesitarás usar la palabra clave volátil.
volatile AtomicInteger counter = // initialize counter
int harvest(){
AtomicInteger old = counter;
counter = new AtomicInteger();
return old.get();
}
Si elimina el volátil del código anterior, podría perder algunos incrementos. De acuerdo con la especificación, también puede obtener una referencia a un objeto AtomicInteger que no está completamente construido, y así obtener un comportamiento indefinido.
Entonces, ¿necesita declarar su objeto atómico como volátil? La respuesta es, depende. Solo son seguros para subprocesos siempre que se publiquen correctamente, como cualquier otro objeto seguro para subprocesos (excepto objetos inmutables, que son casos especiales). En la mayoría de los casos, debes hacerlos definitivos.
- 1. Cuándo usar AtomicReference (Java)? ¿Es realmente necesario?
- 2. Java referencia volátil vs AtomicReference
- 3. ¿Es necesario volátil aquí?
- 4. Si una clase se declara como final es necesario declarar los métodos como finales
- 5. ¿Es 'volátil' necesario en este código C++ multihilo?
- 6. AtomicReference en Java: ¿es necesario para establecer una referencia en un entorno seguro para subprocesos?
- 7. ¿Es posible declarar una matriz como constante
- 8. ¿Es necesario declarar PHP array antes de agregar valores con []?
- 9. java - ¿Tengo que declarar mi variable de miembro de escucha compartida como volátil?
- 10. ¿Por qué es necesario marcar una clase como serializable?
- 11. C: declarar el puntero volátil a la función
- 12. ¿Es aceptable declarar una clase privada como un alias?
- 13. es una variable volátil sincronizada? (java)
- 14. ¿Es necesario declarar una matriz de PHP antes de su uso?
- 15. Si declaro una variable de instancia como volátil, ¿el objeto de esta clase será volátil?
- 16. ¿Puede la variable volátil definirse como estática en Java?
- 17. declarar propiedad como objeto?
- 18. ¿Por qué declarar una interfaz como abstracta?
- 19. ¿Cuál es el uso de la palabra clave volátil?
- 20. ¿Necesito que este campo sea volátil?
- 21. GLES2 ¿Es glBindAttribLocation() necesario?
- 22. Declarar como dependencia o como padre
- 23. ¿Cuándo es necesario deshacerse?
- 24. ¿Es necesario KillTimer?
- 25. ¿Es necesario generar javadoc como parte del proceso de compilación?
- 26. ¿Es realmente necesario KillTimer?
- 27. ¿Es malo declarar una clase vacía?
- 28. ¿Por qué es 'parasitario' volátil en C++?
- 29. ¿Por qué 'esto' no es volátil?
- 30. sobrecarga volátil?
Intento que todos los campos de AtomicReference sean definitivos. Deberías evitar tener que cambiarlo alguna vez. –