Java 指令重新排序示例不起作用

标签 java multithreading synchronization

我需要一些帮助。 我正在尝试创建一个示例,表明需要使用 volatile 来防止指令重新排序。

在这个例子中,我试图证明 b > a 仅在发生重新排序时发生,并且 volatile 会阻止它。

问题是,每次运行我都会得到 b>a,我一定错过了一些愚蠢的东西,但我看不到它。

我在这里缺少什么?

public class Example04Reorder extends Thread {
    volatile static int a = 0;
    volatile static int b = 0;
    public static void main(String[] args) throws InterruptedException {
        Example04Reorder t = new Example04Reorder();
        t.start();
        while( true )
        {
            if ( b > a ) // supposedly happens only on reordering
            {
                System.out.println("b was bigger than a");
                System.exit(1);
            }
        }
    }
    public void run() {
        while (true) 
        {
            a = 5;
            b = 4;
            b = 0;
            a = 0;
        }
    }
 }

最佳答案

这里没有问题。 比较运算符中有两个读取操作。由于第二个线程中的赋值之间没有延迟,因此它们会立即执行。因此,第一个线程有可能获得 b 的值 4,而在读取 a 的值时,它已经设置为 0。这就是您得到结果的原因。

关于Java 指令重新排序示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52647427/

相关文章:

java - 使用增强的 for 循环打印数组列表 - 错误 : cannot find symbol and variable already defined in method

java - 来自相同基本代码的多个 war 文件,Gradle

java - Apache-Flink 快速入门 - 读取 CSV 文件错误 : Futures timed out after [10000 milliseconds]

c++ - 需要帮助追踪 MacOS 上函数入口的 EXC_BAD_ACCESS

python - 使用多个并行线程分部分下载大文件

c - 阅读操作系统的好资源

java - 我们可以在没有 Matlab 的任何其他机器上部署 matlab 生成的 java 代码吗?

multithreading - 事件驱动和基于线程的服务器系统有什么区别?

c++ - 在 C++ 中使用非虚拟公共(public)接口(interface)和作用域锁避免死锁

javascript - 页面加载后从 EpicEditor 中的文本区域同步值