Mon professeur dans une classe Java de niveau supérieur sur le threading a dit quelque chose dont je n'étais pas sûr.
Il a déclaré que le code suivant ne mettrait pas nécessairement à jour la ready
variable. Selon lui, les deux threads ne partagent pas nécessairement la variable statique, en particulier dans le cas où chaque thread (thread principal versus ReaderThread
) tourne sur son propre processeur et ne partage donc pas les mêmes registres / cache / etc et un seul processeur ne mettra pas à jour l'autre.
Essentiellement, il a dit qu'il est possible que ce ready
soit mis à jour dans le thread principal, mais PAS dans le ReaderThread
, de sorte que ReaderThread
cela boucle indéfiniment.
Il a également affirmé qu'il était possible pour le programme d'imprimer 0
ou 42
. Je comprends comment 42
pourrait être imprimé, mais pas 0
. Il a mentionné que ce serait le cas lorsque la number
variable est définie sur la valeur par défaut.
J'ai pensé qu'il n'était peut-être pas garanti que la variable statique soit mise à jour entre les threads, mais cela me semble très étrange pour Java. Est-ce que faire ready
volatile corrige ce problème?
Il a montré ce code:
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;
}
}