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

时间:2018-10-04 13:01:30

标签: 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;
        }
    }
 }

1 个答案:

答案 0 :(得分:4)

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