我需要一些帮助。 我正在尝试创建一个示例,表明需要使用 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/