Вопрос:
A происходит до того, как существует связь между синхронизированными блоками вокруг инициализации y и присвоения r2 (они оба используют один и тот же экземпляр объекта блокировки), как показано вкод, все еще значение r2 меняется.Как это происходит?
Код:
public class ConVisibility {
public int x,y,r1,r2;
Object lock = new Object();
public void initiateValues(){
x=1;
synchronized (lock){
y=2;
}
}
public void assignValues(){
synchronized (lock){
r2=y;
}
r1=x;
}
}
public class LambdaPractice {
public static void main(String[] args) throws Exception {
//example object
ConVisibility conVisibility = new ConVisibility();
//initialization runnable
Runnable runI = () ->{
conVisibility.initiateValues();
};
//assignment runnable
Runnable runA = () ->{
conVisibility.assignValues();
};
//Thread T1 to initialize variables x and y
Thread t1 = new Thread(runI);
//Thread T2 to assign variables r1 and r2
Thread t2 = new Thread(runA);
t1.start();
t2.start();
t1.join(); //join here
t2.join();
System.out.println(conVisibility.r1 +" "+
conVisibility.r2);
}
}
Ожидаемый результат: {0 2} ИЛИ {1 2} (Изменение значения r1 (1или 0) и для r2 установлено значение 2)
Фактический результат: {1 2} ИЛИ {0 0}