Мой учитель в классе Java верхнего уровня по многопоточности сказал то, в чем я не был уверен.
Он заявил, что следующий код не обязательно обновит readyпеременную. По его словам, два потока не обязательно совместно используют статическую переменную, особенно в том случае, когда каждый поток (основной поток по сравнению с ReaderThread) работает на своем собственном процессоре и, следовательно, не использует одни и те же регистры / кеш / и т. Д. И один процессор. не будет обновлять другой.
По сути, он сказал, что возможно, что readyобновляется в основном потоке, но НЕ в ReaderThread, так что ReaderThreadцикл будет бесконечным.
Он также утверждал, что программа могла печатать 0или 42. Я понимаю, как 42можно было распечатать, но нет 0. Он упомянул, что это будет тот случай, когда для numberпеременной установлено значение по умолчанию.
Я подумал, что, возможно, не гарантируется, что статическая переменная обновляется между потоками, но это кажется мне очень странным для Java. Устраняет ли readyэту проблему создание volatile?
Он показал этот код:
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;
}
}
