不使用 volatile 关键字的影响是否特定于平台?
在带有 openJDK 1.7 的 Ubuntu 13.04 x64 上,使用或不使用 volatile 关键字都没有效果;从某种意义上说,程序在不使用 volatile 时会按预期执行。
我想知道这个问题的确切原因是什么,以及为什么它不会像在带有 Oracle JVM 的 Windows 中那样每次都失败。
我知道什么是 volatile 保证以及何时应该使用它。这不是问题。
示例:
public class VolatileTest {
private static boolean test;
public static void main(String... args) {
Thread a = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
test = true;
}
});
Thread b = new Thread(new Runnable() {
@Override
public void run() {
while(!test) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(test);
}
}
});
a.start();
b.start();
}}
最佳答案
Volatile 的效果并不特定于平台。它符合 Java Memory Model. 中规定的规范。对于每个平台,它在 JVM 中的实现明显不同,具体如何强制执行内存屏障。
可以提供示例代码吗?您的测试可能具有误导性。
关于java - 不使用 volatile 关键字的影响是否特定于平台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17349071/