Мой преподаватель в классе 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; } }