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 readyvariabile. 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 readyvenga aggiornato nel thread principale, ma NON in ReaderThread, in modo che ReaderThreadsi ripeta all'infinito.
Ha anche affermato che era possibile stampare 0o 42. Capisco come 42potrebbe essere stampato, ma non 0. Ha detto che questo sarebbe il caso quando la numbervariabile è 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 readyvolatile 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;
}
}
