Marcar una variable como volatile
en Java garantiza que cada hilo ve el valor que se le escribió por última vez en lugar de algún valor obsoleto. Me preguntaba cómo se logra esto realmente. ¿La JVM emite instrucciones especiales que eliminan las caídas de la CPU o algo así?¿Cómo funciona realmente el volátil?
Respuesta
Según tengo entendido, siempre aparece como si la memoria caché se hubiera lavado después de la escritura, y siempre aparece como si las lecturas se realizaran directamente desde la lectura de la memoria. El efecto es que un subproceso siempre verá los resultados de escrituras de otro subproceso y (de acuerdo con el modelo de memoria de Java) nunca un valor en caché. Sin embargo, la implementación real y las instrucciones de la CPU variarán de una arquitectura a otra.
No garantiza la corrección si incrementa la variable en más de un hilo, o verifica su valor y toma alguna medida, ya que obviamente no hay una sincronización real. En general, solo se puede garantizar la ejecución correcta si solo hay un hilo de escritura en la variable y otros están leyendo.
También tenga en cuenta que una variable no volátil de 64 bits se puede leer/escribir como dos variables de 32 bits, por lo que las variables de 32 bits son atómicas pero las de 64 bits no. La mitad se puede escribir antes que otra, por lo que el valor leído puede ser inferior al valor anterior o al nuevo.
Esto es muy útil una página de mis favoritos:
@jgubby: su último párrafo no parece correcto: no puede leer un volátil de 64 bits que tendría 32 bits de una escritura y los otros 32 bits de otra escritura. – SyntaxT3rr0r
@WizardOfOdds: De acuerdo. Quería decir variable no volátil allí. – gubby
@jbuggy: ah ah, eso es lo que pensé, pero no me atreví a editar tu publicación porque no estaba seguro de lo que querías :) Me alegra ayudar, porque de lo contrario era un poco confuso :))) – SyntaxT3rr0r
Exactamente lo que sucede es específico del procesador. En general, hay alguna forma de instrucciones de barrera de memoria. Limpiar todo el caché obviamente sería muy caro: hay protocolos de coherencia de caché en el hardware.
También es importante que ciertas optimizaciones no se realicen en los accesos de campo. El compilador es importante al considerar el multihilo, no solo piense en el hardware.
Exactamente lo que sucede en un programa Java correctamente escrito no es específico del procesador. – gubby
@jgubby La pregunta no pregunta si se emiten instrucciones especiales. –
- 1. ¿Cómo funciona realmente el teléfono?
- 2. Android volátil no funciona?
- 3. ¿Cómo funciona realmente mongoDB?
- 4. ¿Cómo funciona realmente el rake db :: migrate?
- 5. ¿Cómo funciona realmente el ataque XSS?
- 6. ¿Cómo funciona `if (Test-Path ...)` realmente funciona?
- 7. ¿Cómo funciona realmente SSIS Dataflow?
- 8. ¿Cómo funciona un UpdatePanel realmente?
- 9. C# - ¿Realmente se necesita "volátil" como palabra clave?
- 10. virtualenv reubicable - ¿realmente funciona
- 11. ¿Funciona realmente Flash10 + p2p?
- 12. ¿Funciona realmente el filter_var FILTER_VALIDATE_EMAIL de PHP?
- 13. ¿onInterceptTouchEvent() realmente funciona como dijo el SDK?
- 14. ¿Funciona realmente el llavero en iOS?
- 15. ¿Cómo funciona realmente Affine Transform en Java?
- 16. ¿Cómo funciona realmente List :: Util 'shuffle'?
- 17. ¿Cómo funciona realmente DataAnnotations en MVC?
- 18. En Ruby, ¿cómo funciona realmente Coerce()?
- 19. ¿Cómo funciona realmente la opción make "-j"?
- 20. ¿Cómo funciona updatePolicy in maven realmente?
- 21. ¿Cómo funciona realmente el Dynamic Proxy de Java?
- 22. Http and file uploading - ¿Cómo funciona realmente (bajo el capó)
- 23. ¿Cómo funciona el paso por referencia realmente en C#?
- 24. ¿Cómo funciona realmente el bloqueo de I/O de Linux?
- 25. ¿Cómo funciona realmente el uso de la memoria Apache PHP?
- 26. jsTree "create_node" realmente no funciona
- 27. ¿Cómo funciona realmente un tipo de valor en .net?
- 28. ¿Cómo funciona realmente la asignación automática de memoria en C++?
- 29. Análisis html de Python que realmente funciona
- 30. ¿Realmente SplFixedArray funciona mejor que las matrices?
pregunta relacionada (el primero en la lista realidad ..) http://stackoverflow.com/questions/1787450/how-do- i-understand-read-memory-barriers-and-volátil – BalusC
Y un hilo que comencé volátil con muchos "votos por votos" y "favoritos" con respecto a la ejecución fuera de orden: http://stackoverflow.com/questions/2441279/java-volatile-guarantee-and-out-of-order-execution – SyntaxT3rr0r