Как и ожидалось, поток чтения в приведенной ниже программе работает вечно, поскольку он кэшировал флаг остановки (энергонезависимый) в кеше своего локального процессора. Принимая во внимание, что как только я раскомментирую 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...");
}
}
}