"¡Hola, amigo!"

"Hay un gran tema por ahí: el modelo de memoria de Java. Básicamente, no es necesario que lo sepa todavía, pero será útil saberlo".

"Para eliminar todos los problemas potenciales, Java cambió su mecanismo de administración de memoria. Ahora la memoria no se divide simplemente en caché local y memoria global de un subproceso; el mecanismo es aún mejor".

"¡Y más complicado!"

"Sí, mejor y más complicado. Es como un avión. Volar en avión es mejor que caminar, pero más complicado. Trataré de explicar la nueva situación de manera muy simple".

"Esto es lo que se les ocurrió. Se agregó al código un mecanismo para sincronizar la memoria de subprocesos locales, llamado 'sucede antes'. Se inventaron varias reglas/condiciones. Cuando se cumplen estas condiciones, la memoria se sincroniza o actualiza a la actual estado.

"Aquí hay un ejemplo:"

Orden Hilo 1 Hilo 2
1
2

101
102
103
104
105

201
202
203
204
205
public int y = 1;
public int x = 1;

x = 2;
synchronized(mutex)
{
 y = 2;
}
El subproceso está esperando que se libere el mutex.

synchronized(mutex)
{
 if (y == x)
 System.out.println("YES");
}

"Una de estas condiciones es la adquisición del mutex liberado. Si se libera un mutex y se vuelve a adquirir, la memoria se sincronizará antes de la adquisición. El subproceso 2 verá los valores 'más recientes' de las variables x e y, incluso si no los declaras volátiles".

"¡Qué interesante! ¿Y hay muchas de estas condiciones?"

"Suficiente, aquí hay algunas condiciones para sincronizar la memoria:"

  • "Dentro de un solo hilo, ocurre cualquier comando , antes de cualquier operación que lo siga en el código fuente".
  • "La liberación de un bloqueo ocurre antes de que se adquiera el mismo bloqueo".
  • "Se produce una salida de un bloque/método  sincronizado , antes de que se ingrese el bloque/método sincronizado en el mismo monitor".
  • "La escritura de un campo volátil en la memoria ocurre antes de que el mismo campo volátil se lea de la memoria".
  • "Se produce el final del método de ejecución de un objeto Thread , antes de que finalice el método join() o el método isAlive() devuelva falso en el objeto en el mismo hilo".
  • "Se produce una llamada al método start() de un objeto Thread , antes de que el método run() comience en el objeto en el mismo hilo".
  • "El final del constructor ocurre antes del comienzo del método finalize() de esta clase".
  • "Se produce una llamada al método interrupt() , antes de que el subproceso determine que se ha llamado a este método, ya sea porque se lanza una excepción interrumpida o mediante el uso de los métodos isInterrupted() o interrumpido()".

"Entonces, ¿todo es un poco más complicado de lo que pensaba?"

"Sí, un poco más complicado..."

"Gracias, Rishi. Lo pensaré".

"No te preocupes demasiado por este tema. Llegará el momento en que lo entenderás todo por tu cuenta. Por ahora, sería mejor para ti entender los conceptos básicos, en lugar de profundizar en el denso bosque que es el funcionamiento interno de la máquina Java. Java 9 se lanzará y luego todo volverá a cambiar".

"O_o. Sí... Algunas cosas es mejor no saberlas."