JMM存在的问题(可见性问题)

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

全部评论

相关推荐

03-24 17:57
门头沟学院 Java
yakuso:你这头像哈哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务