2012-05-26 19 views

Respuesta

11

En primer lugar, no hay garantizado forma de exponer el almacenamiento en caché debido a variables no volátiles. Su JVM puede ser muy amable con usted todo el tiempo y tratar eficazmente cada variable como volátil.

Dicho esto, hay algunas maneras de aumentar la probabilidad de que los subprocesos guarden en caché sus propias versiones de una variable no volátil. Aquí es un programa que expone la importancia de la volatilidad en la mayoría de las máquinas que he probado en (versión adaptada de 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."); 
    } 
} 

Este programa tendrá típicamente solo salidas de

keepRunning set to false. 

y continuar funcionando. Hacer keepRunning volátil hace que se imprima

keepRunning set to false. 
Thread terminated. 

y terminar.

+2

+1. La misma respuesta que la mía, pero más pronto y más elaborada –

+2

Es curioso, si haces que el bucle haga algo, el ejemplo ya no funcionará (por ejemplo, 'System.out.println (". ");' Inside' while (keepRunning) ' – Miquel

Cuestiones relacionadas