En lenguaje sencillo,
estática : las static
variables están asociadas con la clase , en lugar de con cualquier objeto . Cada instancia de la clase comparte una variable de clase, que está en una ubicación fija en la memoria
volátil : esta palabra clave es aplicable tanto a las variables de clase como de instancia .
El uso de variables volátiles reduce el riesgo de errores de consistencia de la memoria, porque cualquier escritura en una variable volátil establece una relación de suceso anterior con lecturas posteriores de esa misma variable. Esto significa que los cambios en una variable volátil siempre son visibles para otros hilos
Echar un vistazo a este artículo por Javin Paul
entender las variables volátiles de una mejor manera.
En ausencia de volatile
palabra clave, el valor de la variable en la pila de cada subproceso puede ser diferente. Al hacer la variable como volatile
, todos los hilos obtendrán el mismo valor en su memoria de trabajo y se evitarán los errores de consistencia de la memoria.
Aquí el término variable
puede ser static
variable (clase) o variable instance
(objeto).
Con respecto a su consulta:
De todos modos, un valor de variable estática también será un valor para todos los hilos, entonces ¿por qué deberíamos elegir volátil?
Si necesito instance
variable en mi aplicación, no puedo usar static
variable. Incluso en caso de static
variable, no se garantiza la coherencia debido a la memoria caché de subprocesos como se muestra en el diagrama.
El uso de volatile
variables reduce el riesgo de errores de consistencia de la memoria, porque cualquier escritura en una variable volátil establece una relación de suceder antes con lecturas posteriores de esa misma variable. Esto significa que los cambios en una variable volátil siempre son visibles para otros subprocesos.
Además, también significa que cuando un hilo lee una variable volátil, ve no solo el último cambio en el volátil, sino también los efectos secundarios del código que provocó el cambio => los errores de consistencia de memoria aún son posibles con variables volátiles . Para evitar los efectos secundarios, debe usar variables sincronizadas. Pero hay una mejor solución en Java.
El uso del acceso simple a la variable atómica es más eficiente que acceder a estas variables a través del código sincronizado
Algunas de las clases en el java.util.concurrent
paquete proporcionan métodos atómicos que no dependen de la sincronización.
Consulte este artículo de control de concurrencia de alto nivel para obtener más detalles.
Especialmente eche un vistazo a las variables atómicas .
Preguntas SE relacionadas:
Volátil Vs Atómico
Boolean volátil vs AtomicBoolean
Diferencia entre volátil y sincronizado en Java