Мой учитель из класса 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;
}
}