2012-05-26 19 views

risposta

11

Prima di tutto, non c'è garantito modo di esporre il caching a causa di variabili non volatili. La tua JVM potrebbe essere sempre molto gentile con te e trattare efficacemente ogni variabile come volatile.

Detto questo, ci sono alcuni modi per aumentare la probabilità che i thread inseriscano nella cache le loro versioni di una variabile non volatile. Ecco un programma che espone l'importanza di volatili nella maggior parte delle macchine che ho provato su (versione adattata da here):

class Test extends Thread { 

    boolean keepRunning = true; 

    public void run() { 
     while (keepRunning) { 
     } 

     System.out.println("Thread terminated."); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     Test t = new Test(); 
     t.start(); 
     Thread.sleep(1000); 
     t.keepRunning = false; 
     System.out.println("keepRunning set to false."); 
    } 
} 

Questo programma sarà in genere solo in uscita

keepRunning set to false. 

e continuare l'esecuzione. Rendere volatile keepRunning

keepRunning set to false. 
Thread terminated. 

e terminare.

+2

+1. La stessa risposta del mio, ma prima e più elaborata è –

+2

Divertente, se fai fare qualcosa al ciclo, l'esempio non funzionerà più (ad es. 'System.out.println (". ");' Inside' while (keepRunning) ' – Miquel

Problemi correlati