java并发之可见性

并发之可见性

第一种情况:while空循环,永远无法获得主线程修改过的变量值

@Slf4j
public class TestVisibility {
    private static boolean run = true;
    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(()->{
            TestVisibility.m();
        });
        t1.start();
        Thread.sleep(1000);
        run = false;
        Thread.sleep(1000);
        System.out.println(t1.isAlive());
    }

    public static void m() {
        log.info("in");
        while(run) {

        }
        log.info("out");
    }
}

运行结果

在这里插入图片描述

第二种情况:while循环里面执行log.info(“running”),t1线程会获得主线程中对run变量的修改,t1线程会执行完毕

@Slf4j
public class TestVisibility {
    private static boolean run = true;
    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(()->{
            TestVisibility.m();
        });
        t1.start();
        Thread.sleep(1000);
        run = false;
        Thread.sleep(1000);
        System.out.println(t1.isAlive());
    }

    public static void m() {
        log.info("in");
        while(run) {
            log.info("running");
        }
        log.info("out");
    }
}

运行结果

在这里插入图片描述

原因

  • JVM会尽可能去保证内存的可见性,while进行空循环的时候会一直占用CPU,所以CPU没有时间去获取run的最新值,就会一直运行;
  • 当在while循环里面进行打印的时候,CPU会有一点点点点的空闲时间,这个时候CPU去会去主存里面获取run的最新值,t1线程发现run
    = false的时候就会退出循环,t1线程就会正常停止
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值