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