网上看到的例子
/**
* @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中吗?感觉很诡异啊。。。
1 回答
拉丁的传说
TA贡献1789条经验 获得超8个赞
java内存模型并没有规定static变量不能存在cpu cache里啊,还有这种现象不是重排序导致的,是因为ready变量没有强制同步至主内存(可见性)导致的。
添加回答
举报
0/150
提交
取消