下面这段代码是比较常见的证明线程之间不可见的例子,但是我想问的是如果将 Thread.sleep(2000);这段代码去了,为什么第一个线程的死循环就能够跳出,线程之间不是不可见的吗?
我猜测的两种答案:
1.后一个线程先执行结束了,initFlag的共享变量副本进入主内存了,第一个线程再执行。但是我将步骤打印出来,结果并不是这样。
2.之前查阅了其他博客,说是System.out.println内置同步锁,触发了缓存一致性协议!
于是乎,我有将System.out.println换成logeer,但是还是没有出现理论上线程之间不可见的答案。这两种推论都不成立。
头发都急白了,help!help!谁能够说明白,为什么将Thread.sleep(2000)去了,没有加volatile,但是线程之间还是可见了?
/**
* 线程之间是不可见的
*/
public class VolatileVisibilityTest {
private static boolean initFlag =false;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
System.out.println("waiting.....data");
while (!initFlag){
}
System.out.println("wait....data....end");
}).start();
// Thread.sleep(2000);
new Thread(()->predData()).start();
}
public static void predData(){
System.out.println("pred....data");
initFlag = true;
System.out.println("pred....data....end");
}
}