2010-07-09 9 views
13

¿Una variable a la que acceden varios hilos, pero solo dentro de bloques sincronizados, necesita el modificador volátil? Si no, ¿por qué?Modificador volátil Java y bloques sincronizados

+1

Puede que también le interese esta pregunta: http://stackoverflow.com/questions/3103204/difference-between-synchronization-of-field-reads-and-volatile –

+0

No. Consulte esta nueva pregunta SE: http : //stackoverflow.com/questions/3519664/difference-between-volatile-and-synchronized-in-java/34355995#34355995 –

Respuesta

8

No es necesario utilizar volatile dentro de synchronized, sincronizado ya garantiza el comportamiento correcto para el caché local de variables cuando se utiliza de forma coherente (en cada acceso).

volatile funciona en valores primitivos, y puede ser un buen atajo para accesos atómicos a un tipo primitivo. Tenga en cuenta que el comportamiento de la volatilidad ha cambiado en JDK 5 de 1.4.

Más información se puede encontrar here

4

No. Cuando trabaja dentro de un bloque sincronizado, todas las variables en caché se sincronizan en el acceso, ya que crea una barrera de memoria.

Para más detalles, vea esta comparación (con discusión) de volatile to synchronized.

2

bloques que sincronizan en el mismo objeto (o método) se garantiza que no se ejecute en el mismo tiempo. Por lo tanto, , siempre y cuando se sincronice con el mismo objeto, su variable nunca tendrá acceso simultáneo, por lo que no necesita un tratamiento especial.

Si sus accesos no están sincronizados, entonces tiene una condición de carrera. Hacer la variable volatile puede ser correcta para algunas variables primitivas (acepto otras publicaciones para obtener más información sobre volaitle). Si eso no es útil, es casi seguro que tenga un error.

+1

Para ser pedantes, la sincronización en otros idiomas no implica una memoria consistente: el valor puede almacenarse en caché en un registro o memoria local, y aunque el acceso esté sincronizado, puede no ser atómico/consistente. Sin embargo, en Java, sincronización activa un volátil automático. –

+1

Para ser igualmente pedantes, los otros idiomas en los que probablemente estés pensando (C/C++) no tienen una noción intrínseca de sincronización de hilos, o incluso una palabra clave 'synchronized'; tienes que construir algo similar mutexes. Ahí tienes razón: no hay tiempo de ejecución para administrar la consistencia de la memoria para ti. ¡Esos idiomas ni siquiera especifican ninguna semántica para los accesos de memoria simultáneos! Afortunadamente Java es agradable y solo hace lo que esperas que haga. – Karmastan

+0

@YannRamin Como en, la variable en la que se sincroniza es efectivamente volátil con el propósito de realizar modificaciones dentro de ese bloque sincronizado? No estoy seguro de si te interpreté correctamente, pero no puedo encontrar una descripción de ese efecto en otro lugar. – spieden

Cuestiones relacionadas