"Concurrencia Java en la práctica" ofrece el siguiente ejemplo de una clase insegura que debido a la naturaleza del modelo de memoria java puede terminar ejecutándose o imprimir 0.Sincronización de modelo de memoria Java: ¿cómo inducir error de visibilidad de datos?
El problema que esta clase intenta demostrar es que las variables aquí no son "compartidos" entre hilos. Por lo tanto, el valor del hilo visto puede ser diferente de otro hilo, ya que no son volátiles ni están sincronizados. También debido a la reordenación de las declaraciones permitidas por la JVM ready = true, puede establecerse antes del número = 42.
Para mí esta clase siempre funciona bien usando JVM 1.6. ¿Alguna idea sobre cómo hacer que esta clase realice un comportamiento incorrecto (es decir, imprimir 0 o ejecutar para siempre)?
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;
}
}
Respuesta corta no. ¿Pero realmente necesita comprobar si saltar desde el techo es peligroso después de que alguien le dijo y dio buenas razones? – Voo
Usa una computadora con 2 núcleos. –
@Voo ... ¿De qué demonios estás hablando? –