java - 不使用 volatile 关键字的影响是否特定于平台?

标签 java concurrency volatile

不使用 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/

相关文章:

java - ThreadPoolExecutor 政策

java - 没有关键工作volatitle,如何实现DCL?

java - 在什么情况下需要将 volatile 关键字与 Atomic 字段一起使用?

c++ - `volatile` 在线程之间同步变量

Java 简单乘法错误

java - java mailapi 中的变音字符支持

java - 如何正确格式化日期单元格并使用 Apache POI 3.7 填充内容

python - Flask 和缩放与并发

java - Volatile 关键字线程安全

rake db 的 Java EE 替代品 :migrate