【问题标题】:Java Instruction Reordering Example Not WorkingJava 指令重新排序示例不起作用
【发布时间】:2019-03-09 21:18:06
【问题描述】:

我需要一些帮助。 我正在尝试创建一个示例,显示需要 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;
        }
    }
 }

【问题讨论】:

  • Re,“我正在尝试创建一个显示需要 volatile 的示例。”仅供参考,如果您不遵守规则,则永远不能保证多线程程序表现不佳。 Java 语言规范只是允许它表现不佳。这就是编写正确的多线程程序如此困难的原因之一:您无法仅通过测试来证明程序是正确的。

标签: java multithreading synchronization


【解决方案1】:

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

【讨论】:

  • 知道了。所以 b > a 不是原子的。这意味着这个例子是无效的。
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多