我需要一些帮助。 我正在尝试创建一个示例,该示例显示需要使用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;
}
}
}
答案 0 :(得分:4)
这里没有问题。 比较运算符中有两个读取操作。由于第二个线程之间的分配没有延迟,因此它们会立即执行。因此,第一个线程的b值可能为4,而在读取a的值时它已经设置为0。所以这就是为什么要获得结果的原因。