我认为Java规范中volatile的示例有些错误。
在8.3.1.4中。挥发性字段,它说
class Test {
static int i = 0, j = 0;
static void one() { i++; j++; }
static void two() {
System.out.println("i=" + i + " j=" + j);
}
}
Run Code Online (Sandbox Code Playgroud)
...然后方法二可能偶尔会为j打印一个大于i的值,因为该示例不包含同步,并且在第17.4节中解释的规则下,i和j的共享值可能会更新为订购。
我认为,即使这些更新是按顺序进行的,方法二仍可能看到j大于i,因为System.out.println("i=" + i + " j=" + j)它不是原子的,并且i在j之前被读取。
方法二是一样的
read i
read j
Run Code Online (Sandbox Code Playgroud)
所以有可能
read i
i++
j++
read j
Run Code Online (Sandbox Code Playgroud)
在这种情况下,方法二看到j的值大于i,但是更新不会乱序。
因此,乱序并不是看到j> i的唯一原因
应该是System.out.println("j=" + j + " i=" + i);吗?
这次故障是看到j> i的唯一原因