Почему запись в энергонезависимый видна для основного потока? - PullRequest
0 голосов
/ 19 апреля 2020

Представьте себе следующую программу.

class Main {


    static class Whatever {
        int x = 0;
    }


    public static void main(String[] args) {
        Whatever whatever = new Whatever();

        Thread t = new Thread(() -> {
            whatever.x = 1;
        });
        t.start();
        try {
            t.join();
        }
        catch (InterruptedException e) {
        }

        System.out.println(whatever.x);
    }
}

Основной поток кэшировал whatever, а x установлен на 0. Другой поток запускается, кэширует whatever и устанавливает для кэшированного x значение 1.

Выходные данные

1

, поэтому основной поток видел запись. Почему это так?

Почему была сделана запись в общий кеш и почему основной поток сделал недействительным свой кеш для чтения из общего кеша? Почему мне не нужно volatile здесь?

1 Ответ

4 голосов
/ 19 апреля 2020

Из-за присоединения к нему основного потока. См. 17.4.5 в JLS:

Все действия в потоке происходят до того, как какой-либо другой поток успешно вернется из join () в этом потоке.

Также это Верно, что то, что раньше не было, не обязательно означает, что что-то не будет видно.

...