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