Efectos de memoria de sincronización en Java.

Preguntas frecuentes sobre JSR-133 dice:

Pero hay más en la sincronización que la exclusión mutua. La sincronización garantiza que las escrituras en memoria realizadas por un subproceso antes o durante un bloque sincronizado se hagan visibles de manera predecible a otros subprocesos que se sincronizan en el mismo monitor. Después de salir de un bloque sincronizado, liberamos el monitor, que tiene el efecto de vaciar la memoria caché en la memoria principal, de modo que las escrituras realizadas por este subproceso pueden ser visibles a otros subprocesos. Antes de que podamos ingresar a un bloque sincronizado, adquirimos el monitor, que tiene el efecto de invalidar la memoria caché del procesador local para que las variables se vuelvan a cargar desde la memoria principal. Entonces podremos ver todas las escrituras visibles en la versión anterior.

También recuerdo haber leído que en las modernas máquinas virtuales de Sun las sincronizaciones no controladas son baratas. Estoy un poco confundido por esta afirmación. Considere el código como:

class Foo {
    int x = 1;
    int y = 1;
    ..
    synchronized (aLock) {
        x = x + 1;
    }
}

Las actualizaciones de x necesitan la sincronización, pero ¿la adquisición del bloqueo borra el valor de y también del caché? No puedo imaginar que ese sea el caso, porque si fuera cierto, las técnicas como el trazado de líneas de bloqueo podrían no ser útiles. Alternativamente, ¿puede la JVM analizar de manera confiable el código para asegurarse de que y no se modifique en otro bloque sincronizado utilizando el mismo bloqueo y, por lo tanto, no descargue el valor de y en la memoria caché al ingresar al bloque sincronizado?

Respuestas a la pregunta(7)

Su respuesta a la pregunta