При завершении выполнения синхронизированного блока весь кэш процессора сбрасывается или только тот объект, на котором действует синхронизированный оператор, будет сброшен? В приведенном ниже примере, когда поток завершил выполнение метода2, данные obj2 также покраснели в основную память?Кэш-флеш на синхронизированном входе, выходе и волатильном режиме чтения и записи
class cls1 {
int x=10;
}
class cls2{
int y=10;
}
class cls3{
cls1 obj1;
cls2 obj2;
public void method2(){
obj2.y=10;
synchronized(obj1){
obj1.x=30;
}
}
public static void main(String[] args) {
final cls3 obj3 = new cls3();
Thread thread1 = new Thread(){
public void run(){
obj3.method2();
}
};
Thread thread2 = new Thread(){
public void run(){
System.out.println(obj3.obj1.x);
}
};
}
}
Назначение 'obj2.y = 10' не может быть переупорядочено после блока' synchronized' из-за барьера памяти записи в конце блока. См. Здесь: http://gee.cs.oswego.edu/dl/jmm/cookbook.html – Gray
Кроме того, существует гарантия, что при переходе барьера записи любые грязные блоки (включая 'obj2.y') будут записанных в основную память. См. Тот же документ. Вы правы, что нет гарантии заказа, но есть гарантия на память. – Gray