我需要一些帮助。
我正在尝试创建一个示例,表明需要 volatility 来防止指令重新排序。
在这个例子中,我试图证明 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。这就是您得到结果的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)