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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top