Le variabili statiche sono condivise tra i thread?
-
30-10-2019 - |
Domanda
Il mio insegnante in una classe Java di livello superiore su Threading ha detto qualcosa di cui non ero sicuro.
Ha dichiarato che il seguente codice non avrebbe necessariamente aggiornato il ready
variabile. Secondo lui, i due thread non condividono necessariamente la variabile statica, in particolare nel caso in cui ogni thread (thread principale contro ReaderThread
) è in esecuzione sul proprio processore e quindi non condivide gli stessi registri/cache/ecc. E una CPU non aggiornerà l'altra.
Essenzialmente, ha detto che è possibile che ready
viene aggiornato nel thread principale, ma non nel ReaderThread
, affinché ReaderThread
si aggirerà infinitamente.
Ha anche affermato che era possibile per il programma stampare 0
o 42
. Capisco come 42
potrebbe essere stampato, ma non 0
. Ha detto che questo sarebbe il caso quando il number
La variabile è impostata sul valore predefinito.
Ho pensato che forse non è garantito che la variabile statica fosse aggiornata tra i thread, ma questo mi sembra molto strano per Java. Fa ready
volatile correggere 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;
}
}
Nessuna soluzione corretta