2011-05-22 9 views

Respuesta

7

No. Volatile significa que la variable no se almacena en caché en ningún caché por subproceso, y su valor siempre se recupera de la memoria principal cuando es necesario. La sincronización significa que esos cachés por hilo se mantendrán sincronizados en ciertos puntos. En teoría, usar una variable volátil puede tener una gran penalización de velocidad si muchos hilos necesitan leer el valor de la variable, pero se cambia solo en raras ocasiones.

+0

Si se requiere algún tipo de sincronización, aren' ¿Estás hablando de penalizaciones de velocidad de todos modos? (Generalmente, no tiene mucho sentido sincronizar las escrituras si no estás sincronizando las lecturas también ...) – cHao

1

volatile variables no están sincronizadas (al menos, no en la forma en que synchronized cosas están sincronizadas). Lo que hace volatile es asegurarse de que se recupera una variable cada vez que se usa (es decir, evita ciertos tipos de optimización), y de IIRC que se lee y escribe en el orden correcto. Esto podría emular algunos tipos de sincronización, pero no puede funcionar igual si su setter tiene que configurar más de una cosa. (Si establece dos volatile variables, por ejemplo, habrá un punto en el que se establece uno y el otro no lo es.)

0

En realidad Nº

volatile es en realidad forma más débil de sincronización, cuando se declara campo como volatile, el compilador y el tiempo de ejecución entienden que este variable se comparte y las operaciones que se realizan en él no se deben reordenar con otras operaciones de memoria. Las variables volátiles no se almacenan en caché en registros o en cachés donde están ocultas de otros procesadores, por lo que una lectura de una variable volatile siempre devuelve una escritura reciente de cualquier subproceso.

0

sólo un ejemplo:

First thread run : 
while(stopped){ 
... do something 
} 

Second thread run : 
stopped = true; 

es útil para declarar dejado como un booleano volátil para la primera rosca para tener un valor fresco de la misma.

4

No, llamar a synchronized El método getXXX/setXXX no es lo mismo que leer/escribir en una variable volatile.

Varios hilos pueden leer simultáneamente o escribir en una variable volatile. Pero solo un hilo a la vez puede leer o escribir en una variable protegida por un bloque synchronized.

0

No hay ninguna relación.

Básicamente

  • volátil => siempre recupera último valor del parámetro
  • sincronizada => sólo sirve 1 hilo al mismo tiempo
Cuestiones relacionadas