Il mio insegnante in un corso Java di livello superiore sul threading ha detto qualcosa di cui non ero sicuro.
Ha affermato che il codice seguente non aggiorna necessariamente la ready
variabile. Secondo lui, i due thread non condividono necessariamente la variabile statica, in particolare nel caso in cui ogni thread (thread principale rispetto a ReaderThread
) è in esecuzione sul proprio processore e quindi non condivide gli stessi registri / cache / ecc. E una CPU non aggiornerà l'altro.
In sostanza, ha detto che è possibile che ready
venga aggiornato nel thread principale, ma NON in ReaderThread
, in modo che ReaderThread
si ripeta all'infinito.
Ha anche affermato che era possibile stampare 0
o 42
. Capisco come 42
potrebbe essere stampato, ma non 0
. Ha detto che questo sarebbe il caso quando la number
variabile è impostata sul valore predefinito.
Ho pensato che forse non è garantito che la variabile statica venga aggiornata tra i thread, ma questo mi sembra molto strano per Java. La creazione di ready
volatile risolve questo problema?
Ha mostrato questo codice:
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;
}
}