Распределяются ли статические переменные между потоками?

Мой учитель в классе 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;  
    }  
}
92
задан Lii 17 December 2018 в 12:04
поделиться