En Java, la palabra clave volatile
se utiliza para indicar que una variable puede ser modificada por diferentes hilos. El propósito principal de volatile
es hacer que una variable sea segura para los hilos, garantizando un acceso atómico.
En programación multihilo, atómico se refiere a una operación que se completa en un solo paso desde el punto de vista de otros hilos. Estas operaciones son esenciales para evitar inconsistencias en los datos cuando se manejan variables con varios hilos.
Cuando una variable se declara como volatile
, a la JVM se le instruye que siempre lea el valor de esa variable del almacenamiento principal(como la memoria RAM) en lugar del caché de la CPU. Esto se debe a que, en una aplicación multihilo, el código puede estar ejecutándose en diferentes núcleos de CPU, y cada núcleo puede tener su propio caché.
Normalmente, cuando un hilo modifica una variable, los cambios pueden no ser inmediatamente visibles para otros hilos debido al tiempo que tarda la actualización en propagarse de la caché de la CPU al almacenamiento principal. Pero, al declararse una variable como volatile
, cualquier cambio realizado en ella por un hilo será inmediatamente visible para todos los demás hilos.
class EjemploVolatile {
private volatile int count = 0;
void incrementCount() {
count++;
}
int getCount() {
return count;
}
}
En este ejemplo, count
es una variable volatile
. Si varios hilos están llamando al método incrementCount()
, el uso de volatile
garantiza que todos los hilos verán la última versión de count
.
Es importante señalar que volatile
solo garantiza la visibilidad y orden de los cambios realizados a una única variable. No garantiza la atomicidad de las operaciones compuestas, como incrementar un valor (count++
), que en realidad es una operación de tres pasos: leer, modificar y escribir. Para garantizar la atomicidad en operaciones compuestas, necesitaríamos usar mecanismos de sincronización adicionales, como synchronized
o las clases de bloqueo en java.util.concurrent.locks
.
Por lo tanto, volatile
es una herramienta útil para manejar variables con seguridad en un entorno multihilo, pero solo es una parte del conjunto de herramientas que Java proporciona para el manejo de concurrencia.