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语义的区别

alt