Мой преподаватель в классе java на верхнем уровне в потоке сказал что-то, о чем я не был уверен.
Он заявил, что следующий код не обязательно обновляет переменную ready. По его словам, эти два потока не обязательно разделяют статическую переменную, особенно в том случае, когда каждый поток (основной поток по сравнению с ReaderThread) работает на своем собственном процессоре и поэтому не использует одни и те же регистры/кеш/etc и один CPU не будет обновлять другой.
По сути, он сказал, что возможно, что 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;
}
}