x_iunknown:
Me Hava siguiente código para probar volátil . bEnd
y nCount
se 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:
- lector lee
nCount 0
- escribe wirter
nCount = 100
- escribe wirter
bEnd = true
- grabados escritor
thread Writer bEnd = true
- lector lee
bEnd true