java происходит до реализации в архитектуре x86, t1 записывает в основную память? - PullRequest
2 голосов
/ 19 апреля 2020

Как и ожидалось, поток чтения в приведенной ниже программе работает вечно, поскольку он кэшировал флаг остановки (энергонезависимый) в кеше своего локального процессора. Принимая во внимание, что как только я раскомментирую println в потоке читателя, флаг получает обновленное значение флага, и программа останавливается. Как это возможно, поскольку поток записи только записывает флаг в свой локальный кэш и еще не сбрасывается в основную память?

Примечание. Запуск этой программы на компьютере с архитектурой MacBook Pro x86.

public class FieldVisibility {
    boolean stop = false;
    public static void main(String[] args) throws Exception {
        FieldVisibility fv = new FieldVisibility();

        Runnable writerThreadJob = () -> {  fv.writer();    };
        Runnable readerThreadJob = () -> {  fv.reader();    };

        Thread writerThread = new Thread(writerThreadJob);
        Thread readerThread = new Thread(readerThreadJob);

        readerThread.start();
        try {   Thread.sleep(2);    } catch (InterruptedException e) {}
        writerThread.start();
    }

    private void writer() {
        stop = true;
    }

    private void reader() {
        while (!stop) {
//          System.out.println("stop is still false...");
        }
    }
}
...