Mój nauczyciel z wyższego poziomu Java na temat wątków powiedział coś, czego nie byłem pewien.
Stwierdził, że poniższy kod niekoniecznie zaktualizuje ready
zmienną. Według niego, dwa wątki niekoniecznie współdzielą zmienną statyczną, szczególnie w przypadku, gdy każdy wątek (wątek główny versus ReaderThread
) działa na swoim własnym procesorze i dlatego nie ma tych samych rejestrów / pamięci podręcznej / itp. I jednego procesora nie zaktualizuje drugiego.
Zasadniczo powiedział, że jest możliwe, że ready
jest aktualizowany w głównym wątku, ale NIE w ReaderThread
, więc toReaderThread
będzie się zapętlać w nieskończoność.
Twierdził również, że program mógł wydrukować 0
lub 42
. Rozumiem, jak 42
można wydrukować, ale nie 0
. Wspomniał, że tak będzie w przypadkunumber
zmiennej na wartość domyślną.
Pomyślałem, że być może nie ma gwarancji, że zmienna statyczna jest aktualizowana między wątkami, ale wydaje mi się to bardzo dziwne dla Javy. Czy tworzenie ready
ulotności rozwiązuje ten problem?
Pokazał ten kod:
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;
}
}