"¡Hola, amigo!"

"¡Hola, Ellie!"

"Quiero hablarte sobre el modificador volátil. ¿Sabes qué es?"

"Algo relacionado con hilos. No recuerdo exactamente".

"Entonces escucha. Aquí hay algunos detalles técnicos para ti:"

"Una computadora tiene dos tipos de memoria: memoria global (ordinaria) y memoria integrada en el procesador. La memoria integrada en el procesador se divide en registros, un caché de primer nivel (L1), un caché de segundo nivel (L2) y tercer nivel (L3)".

“Estos tipos de memoria tienen diferentes velocidades. La memoria más rápida y pequeña son los registros, luego la memoria caché del procesador (L1, L2, L3) y finalmente la memoria global (la más lenta)”.

"La memoria global y la memoria caché del procesador funcionan a velocidades muy diferentes, por lo que la máquina Java permite que cada subproceso almacene las variables utilizadas con más frecuencia en la memoria de subprocesos locales (en la memoria caché del procesador)".

"¿Se puede controlar este proceso de alguna manera?"

"No realmente. Todo el trabajo lo realiza la máquina Java. Es muy inteligente cuando se trata de optimizar el rendimiento".

"Pero he aquí por qué les digo esto. Hay un pequeño problema. Cuando dos subprocesos están trabajando con la misma variable, cada uno puede almacenar una copia en su propio caché local. Y luego un subproceso puede cambiar la variable, pero el segundo podría no ver el cambio, porque todavía está trabajando con su propia copia de la variable".

"Bueno, ¿qué se puede hacer entonces?"

"Los creadores de Java proporcionaron una palabra clave especial para esta situación: volátil. Si se accede a una variable desde diferentes subprocesos, debe marcarla con el modificador volátil, para que la máquina Java no la guarde en la memoria caché. Así es como suele aspecto:"

public volatile int count = 0;

"Oh, lo recuerdo. Ya mencionaste esto. Ya lo sé".

"Claro que sí. Pero lo recordaste solo cuando te lo dije."

"Er, bueno, me he olvidado un poco".

"¡La repetición es la madre del aprendizaje!"

"Aquí hay algunos datos nuevos sobre el modificador volátil. El modificador volátil solo garantiza que la variable se leerá y escribirá de manera segura. No garantiza que se cambiará de manera segura".

"¿Cual es la diferencia?"

"Mira cómo se cambia la variable:"

Código Lo que realmente sucede: Descripción
count++
register = count;

register = register+1;

count = register;
Paso 1.
El valor de la cuenta variable se copia de la memoria global a un registro del procesador.

Paso 2.
Dentro del procesador, la variable de registro se incrementa en 1.

Paso 3.
El valor de la variable se copia del procesador a la memoria global.

"¡Guau! Entonces, ¿todas las variables se cambian solo en el procesador?"

"Sí."

"¿Y los valores se copian de un lado a otro: de la memoria al procesador y viceversa?"

"Sí."

"El modificador volátil garantiza que cuando se acceda a la variable count, se leerá de la memoria (paso 1). Y si un hilo quiere asignar un nuevo valor, definitivamente estará en la memoria global (paso 3)".

"Pero la máquina Java no garantiza que no habrá ningún cambio de hilo entre los pasos 1 y 3".

"Entonces, ¿incrementar la variable en 1 es en realidad tres operaciones?"

"Sí."

"Y si dos subprocesos quieren ejecutar simultáneamente count ++, ¿podrían interferir entre sí?"

"Sí, échale un vistazo:"

Hilo 1 Hilo 2 Resultado
register1 = count;
register1++;
count = register1;
register2 = count;
register2++;
count = register2;
register1 = count;
register2 = count;
register2++;
count = register2;
register1++;
count = register1;

"Entonces, ¿puedes acceder a la variable, pero cambiarla sigue siendo arriesgado?"

"Bueno, puedes cambiarlo, solo ten cuidado ☺"

"¿Cómo?"

" sincronizado  es nuestro mejor amigo."

"Veo."