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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top