Почему значение для r2 меняется после использования синхронизированного ключевого слова? - PullRequest
0 голосов
/ 06 июля 2019

Вопрос:

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}

...