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 readyvariable. 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 readysoit mis à jour dans le thread principal, mais PAS dans le ReaderThread, de sorte que ReaderThreadcela boucle indéfiniment.
Il a également affirmé qu'il était possible pour le programme d'imprimer 0ou 42. Je comprends comment 42pourrait être imprimé, mais pas 0. Il a mentionné que ce serait le cas lorsque la numbervariable 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 readyvolatile 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;  
    }  
}
