java - volitile关键字问题

查看:124
本文介绍了java - volitile关键字问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

网上看到的例子

/**
 * @author zhengbinMac
 */
public class NoVisibility {
    private static boolean ready;
    private static int number;
    private static class ReaderThread extends Thread {
        @Override
        public void run() {
            while(!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }
    public static void main(String[] args) {
        new ReaderThread().start();
        number = 42;
        ready = true;
    }
}

NoVisibility可能会持续循环下去,因为读线程可能永远都看不到ready的值。
甚至NoVisibility可能会输出0,因为读线程可能看到了写入ready的值,但却没有看到之后写入number的值,这种现象被称为重排序。

我的问题是:
难道static变量也会被缓存到cpu cache中吗?感觉很诡异啊。。。

解决方案

java内存模型并没有规定static变量不能存在cpu cache里啊,还有这种现象不是重排序导致的,是因为ready变量没有强制同步至主内存(可见性)导致的。

这篇关于java - volitile关键字问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆