¿Por qué sucede-Antes de la volátil fin de Instrucción Reordenamiento falla?

x_iunknown:

Me Hava siguiente código para probar volátil . bEndy nCountse definen volátil.

nCount = 0, bEnd = false

El hilo escritor fijará

nCount = 100, bEnd = true

El hilo lector lea estas viriables e imprimirlas. Base en el Java-sucede antes de la orden, en mi opinión, asegura volátiles nPosiciones = 100 Cuando la curva = true . Pero a veces el programa Imprimir esto:

main thread done.
thread Reader running ...
thread Writer running ...
SharedData nCount = 0, bEnd = false
thread Writer bEnd = true
thread Reader nCount = 0, bEnd = true
thread Reader nCount = 100, bEnd = true
thread Reader nCount = 100, bEnd = true
thread Reader done.

¿Cómo puede el lector de conseguir "nPosiciones = 0, curva = true" ???

El siguiente código se ejecuta en Windows 10, jdk1.8.0_131

public class HappensBeforeWithVolatile {

    public static void main(String[] args) {

        Thread threadWriter = new Thread(new Writer());
        Thread threadReader = new Thread(new Reader());
        threadWriter.start();
        threadReader.start();

        System.out.println("main thread done.");
    }
}

class Writer implements Runnable {

    @Override
    public void run() {
        System.out.println("thread Writer running ...");
        SharedData.nCount = 100;
//        System.out.println("thread Writer nCount = 100");
        SharedData.bEnd = true;
        System.out.println("thread Writer bEnd = true");
    }
}

class Reader implements Runnable {

    @Override
    public void run() {
        System.out.println("thread Reader running ...");
        System.out.println("thread Reader nCount = " + SharedData.nCount + ", bEnd = " + SharedData.bEnd);
        System.out.println("thread Reader nCount = " + SharedData.nCount + ", bEnd = " + SharedData.bEnd);
        if (SharedData.nCount == 0 && SharedData.bEnd) {
            System.out.println("thread Reader CODE REORDER !!!");
        }
        System.out.println("thread Reader nCount = " + SharedData.nCount + ", bEnd = " + SharedData.bEnd);
        System.out.println("thread Reader done.");
    }
}

class SharedData {
    volatile public static boolean bEnd = false;
    volatile public static int nCount = 0;

    static {
        System.out.println("SharedData nCount = " + nCount + ", bEnd = " + bEnd);
    }
}
Xingbin:

asegura volátiles nCount = 100 cuando INFLEXIÓN = true

Tecnológicamente, sí. Pero el lector no ha leído los atómicamente. Por lo que podría imprimir nCount = 0 and bEnd = true.

Aquí hay un ejemplo:

  1. lector lee nCount 0
  2. escribe wirter nCount = 100
  3. escribe wirter bEnd = true
  4. grabados escritor thread Writer bEnd = true
  5. lector lee bEnd true

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=175516&siteId=1
Recomendado
Clasificación