2012-04-26 13 views
5

¿cuál es la diferencia en el uso de volatile keyword en java4 y java5 en adelante?usando la palabra clave volátil en java4 y java5

y relacionado con esto,

operaciones de lectura/escritura en variables no atómicos (largo/doble) son atómica cuando están declarada como volátil.

¿Es esto también cierto para java4 o es válido desde java5 en adelante ???

+0

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile – Luciano

+0

¿Por qué supone que hay diferencias entre java4 y java5 relacionadas con la palabra clave volátil? – claesv

+5

@claesv porque hay. El modelo de memoria de Java cambió entre esas versiones. – Luciano

Respuesta

3

Las personas han proporcionado buenos puntos y referencias que responden a mi pregunta que contesta la primera parte.

Yendo específica a la segunda parte de la pregunta, esta leí en algún foro:

Un volátil declaró larga es atómica (pre-Java 5 también) en el sentido de que garantiza (para todos JVM implementaciones) una lectura o escritura va directamente a la memoria principal en lugar de dos registros de 32 bits.

Y

Pre-Java 5, volátil se supone proporcionar tales garantías por mucho tiempo y doble. Sin embargo, las cosas no funcionaron de esta manera en la práctica, y las implementaciones violaron con frecuencia esta garantía. Como recuerdo, el problema pareció arreglarse alrededor de JDK 1.4, pero como todavía estaban trabajando en el modelo de memoria, no hicieron ningún anuncio claro hasta JDK 5, cuando las nuevas reglas eran anunciado, y las garantías de memoria realmente significaron algo.

Y esto es de Java Language Specification, Segunda edición:

17,4 Tratamiento no atómica de doble y larga

La carga, almacenar, leer y escribir en las acciones sobre las variables volátiles son atomic, incluso si el tipo de la variable es doble o largo.

3

Este sitio da una buena explicación de las diferencias: http://www.javamex.com/tutorials/synchronization_volatile.shtml

También dan una explicación del comportamiento de los volátiles en Java 5 en una página separada: http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml

+0

Dice el primer artículo de referencia: "A partir de Java 5, el acceso a una variable volátil crea una barrera de memoria: sincroniza efectivamente todas las copias en caché de variables con la memoria principal" – Raedwald

4

Sí hay una diferencia.
Hasta Java 4 volatile podría ser reordenado por el compilador con respecto a cualquier lectura o escritura anterior, lo que lleva a sutiles errores de concurrencia, p. por lo que es imposible implementar un bloqueo double check (idioma muy común para Singleton).
Esto se soluciona en Java 5.0 que extiende la semántica para volatile que no se puede reordenar con respecto a cualquier lectura o escritura posterior e introduce un nuevo modelo de memoria. Puede leer esto Double Checked Locking por ejemplo referencia

0

¿Cuál es la diferencia en el uso de palabras clave volátiles en java4 y java5 en adelante?

JMM antes de que JDK5 se rompa y el uso de volátiles para JDK4 puede no proporcionar el resultado deseado. Para obtener más comprobar esto: http://www.ibm.com/developerworks/library/j-jtp02244/

operaciones de lectura/escritura en variables no atómicos (largo/doble) son atómica cuando se declaran tan volátil.

Lectura/Escritura para doble/largo pasan como dos operaciones separadas de 32 bits. Para dos hilos es posible que un hilo haya leído 32 bits más altos y otro haya leído 32 bits más bajos de una variable larga/doble. En resumen, leer/escribir en largo no es operación atómica a diferencia de otras primitivas. Se supone que el uso de volátiles para larga/doble proporciona la garantía de que las instrucciones para volátiles no se vuelven a solicitar para lectura/escritura volátil por el compilador y volátiles también proporciona garantía de visibilidad. Pero nuevamente puede no funcionar para JDK 4 o antes.

Cuestiones relacionadas