不加volatile时,打印不了成功
因为两个线程中的工作内存都有initFLag副本,其中一个变了对另一个并没有影响
package com.kang.jmm;
/**
* @author klr
* @create 2020-09-10-22:23
*/
public class VolatileVisibility {
// private static boolean initFlag = false;
private static volatile boolean initFlag = false;
//两个线程时,每个线程都有自己的变量副本值
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("还未准备数据");
while (!initFlag) {
}
System.out.println("成功");//不加volatile时,执行不了这句话,因为initFlag是在第二个线程中变的,并不能影响到第一个线程的initFlag
}
}).start();
Thread.sleep(2000);
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("准备数据中");
initFlag=true;
System.out.println("数据完成");
}
}).start();
}
}
网友评论