Considere francotirador código de abajo:es la sincronización necesaria durante la lectura si hay contención podría ocurrir
package sync;
public class LockQuestion {
private String mutable;
public synchronized void setMutable(String mutable) {
this.mutable = mutable;
}
public String getMutable() {
return mutable;
}
}
A la hora Time1 hilo Thread1 actualizará la variable ‘mutable’. Se necesita sincronización en setter para vaciar la memoria de la memoria caché local a la memoria principal. En el momento Time2 (Time2> Time1, no hay contención de hilos) thread Thread2 leerá el valor de mutable.
La pregunta es: ¿tengo que poner sincronizado antes de getter? Parece que esto no causará ningún problema: la memoria debe estar actualizada y la memoria caché local de Thread2 debe estar invalidada por Thread1, &, pero no estoy seguro.
Enlazar en Java se define en términos de relaciones * happens-before *. No trates de pensar en términos de caches de enjuague, porque estarás equivocado. Por un lado, las optimizaciones del compilador son importantes. Incluso si el caché de lavado era un modelo preciso, si el objeto referido es mutable, el orden de las actualizaciones no estaría garantizado. (Hasta la especificación 1.5, la especificación sí usaba un modelo de cavidades de enjuague, pero no se podía implementar). –