2010-04-22 19 views
8

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?

+0

pregunta relacionada (el primero en la lista realidad ..) http://stackoverflow.com/questions/1787450/how-do- i-understand-read-memory-barriers-and-volátil – BalusC

+0

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

Respuesta

8

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:

http://www.cs.umd.edu/~pugh/java/memoryModel/

+2

@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

+1

@WizardOfOdds: De acuerdo. Quería decir variable no volátil allí. – gubby

+0

@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

1

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.

+1

Exactamente lo que sucede en un programa Java correctamente escrito no es específico del procesador. – gubby

+0

@jgubby La pregunta no pregunta si se emiten instrucciones especiales. –

Cuestiones relacionadas