Я прочитал в книге, в котором говорится, что из-за оптимизации компилятора выполнение кода может быть переупорядочено, чтобы заставить ReaderThread быть в бесконечном цикле. Как это возможно?Многопоточная видимость Java?
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
}
}
Вы пробовали работать над кодом? он не идет в бесконечном цикле, когда я запускал его в Eclipse с помощью JRE-8 – AADProgramming
@AADTechnical. Это ничего не доказывает. Суть в том, что JLS * позволяет * этот код приводить к бесконечному циклу. См. Мой ответ. –
@AADTechnical yes Я побежал на своем настольном ПК с 5 ReaderThreads, они отлично выполнили (печать 42). Но это зависит от настройки компилятора и процессора. Это пример в книге Java Concurrency in Action. – sonnywang