java

2012-03-26 11 views
5

Cuando leí el "concurrencia java en la práctica" c03, yo estaba confundido por el siguiente programa:java

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; 
    } 
} 

Debido a la visibilidad de reordenación y el hilo, el bucle nunca se puede dejar, o la salida puede ser cero, pero lo he intentado muchas veces, y la salida siempre es 42. ¿Toda la razón es que soy muy afortunado?

+1

Esta pregunta es exactamente la misma que [ésta] (http://stackoverflow.com/questions/1919469/question-about-java-concurrency-in-practice-example). – xea

Respuesta

9

Toda la razón es que soy muy afortunado?

No necesariamente. Dependerá también de la arquitectura de su procesador y la implementación de JVM. Ese es uno de los problemas con los problemas del modelo de memoria sutil: pueden ser muy difíciles de reproducir en la naturaleza.

+0

OK, ya veo. Gracias –

+0

No entiendo. ¿Cómo está lista la leva para ser verdadera antes de que el número se establezca en 42? Es decir, si ningún otro hilo los está cambiando. – Burkhard

+1

@ Burkhard: Supongamos que publico dos cartas a la misma persona en diferentes buzones postales. El que se publica en segundo lugar puede llegar al destinatario antes que el que se publica primero. Lo mismo es cierto para la visibilidad de la memoria entre los hilos. –