Mi profesor en una clase de Java de nivel superior sobre subprocesos dijo algo de lo que no estaba seguro.
Dijo que el siguiente código no actualizaría necesariamente la ready
variable. Según él, los dos hilos no comparten necesariamente la variable estática, específicamente en el caso en que cada hilo (hilo principal versusReaderThread
) se ejecuta en su propio procesador y, por lo tanto, no comparte los mismos registros / caché / etc. y una CPU. no actualizará el otro.
Esencialmente, dijo que es posible que ready
se actualice en el hilo principal, pero NO en el ReaderThread
, por lo queReaderThread
repetirá infinitamente.
También afirmó que era posible que el programa imprimiera 0
o 42
. Entiendo cómo 42
podría imprimirse, pero no 0
. Mencionó que este sería el caso cuando elnumber
variable se establece en el valor predeterminado.
Pensé que tal vez no se garantiza que la variable estática se actualice entre los subprocesos, pero esto me parece muy extraño para Java. ¿Hacer ready
volátiles corrige este problema?
Mostró este código:
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;
}
}