package com.ydlclass.thread;
//volatile的两个作用是,禁止指令重排,解决内存的可见性问题
public class InvisibleProblem {
public volatile static boolean flag = false;
//public volatile static boolean flag = false;即可避免可见性问题;
//volatile的含义是易变的,他的作用是:对于写操作时,会将变化强制刷在主存中,并且将缓存中的数据修改为不可用,如果想用只能从内存中加载
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while(!flag){//由于一直处于空转状态,所以此线程一直拿的都是缓存区中的flag,主存中的flag都不会加载到缓存中;
}
System.out.println("你能看见我吗?");
}).start();
Thread.sleep(2000);
flag = true;
//按理说主线程会在两秒之后flag变为true,子线程会停止循环并且答应那句话;但实际上并没有,这就是不可见的问题;
}
}
语义:happens_before语义与as_if_serial语义的区别