Les variables statiques sont-elles partagées entre les fils?
-
30-10-2019 - |
Question
Mon professeur dans un cours Java de niveau supérieur sur le filetage 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 le ready
variable. Selon lui, les deux fils ne partagent pas nécessairement la variable statique, en particulier dans le cas lorsque chaque thread (thread principal contre ReaderThread
) s'exécute sur son propre processeur et ne partage donc pas les mêmes registres / cache / etc. et un processeur ne metra pas à jour l'autre.
Essentiellement, il a dit qu'il était possible que ready
est mis à jour dans le fil principal, mais pas dans le ReaderThread
, pour que ReaderThread
Va boucle infiniment.
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 le number
La variable est définie sur la valeur par défaut.
Je pensais peut-être qu'il n'est pas garanti que la variable statique est mise à jour entre les fils, mais cela me semble très étrange pour Java. Faire de la fabrication ready
Volatile Corrigez 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;
}
}
Pas de solution correcte