Java происходит до отношений?

Рассмотрим следующий код.

public class Test {
    private boolean running = false;

    public void run() {
        running = true;
    }

    public void test() {
        boolean running1 = running;
        boolean running2 = running;
        System.out.println("running1: " + running1);
        System.out.println("running2: " + running2);
    }
}

Поток A вызывает run(), затем другой поток B вызывает test(), и не должно быть никаких отношений «происходит до». Я знаю, что не гарантируется, что поток B увидит изменения, внесенные потоком A. Но возможно ли, что вывод этой программы:

running1: true
running2: false

person stonar96    schedule 22.06.2020    source источник
comment
Это почти мой вопрос, но не совсем так. В предлагаемом ответе используются две разные переменные. Однако я читаю только из одной переменной. Итак, ответ: это не полностью отвечает на мой вопрос. Изменить: был предложен stackoverflow.com/q/16213443/3882565.   -  person stonar96    schedule 22.06.2020
comment
Но возможно ли, что [...]: да, это (что бы [...] ни было). Поведение программы не определено, так что может случиться буквально все что угодно.   -  person Bruno Reis    schedule 23.06.2020


Ответы (1)


Да, это возможно, потому что это явно не запрещено.

Чтение running для присвоений running1 и running2 может происходить в любом порядке по отношению друг к другу, а чтение running2 может происходить после первого System.out.println. И ничего не говорит о том, что любое из чтений должно быть из кеша или основной памяти.

По сути, он очень открыт в отношении того, что он может печатать (и почему).

person Andy Turner    schedule 22.06.2020
comment
Спасибо, этот ответ очень помог, но теперь у меня другой вопрос. Что, если я заменю его на boolean running1 = running; boolean running2; if (running1) { running2 = running; }. Теперь кажется, что его нельзя переупорядочить, или можно? Было бы неплохо, если бы вы также могли рассказать об этом случае в своем ответе. - person stonar96; 23.06.2020