小编Tim*_*Tim的帖子

如何理解Java语言规范中的易失性示例?

我认为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的唯一原因

java jvm java-memory-model language-lawyer

4
推荐指数
1
解决办法
144
查看次数

标签 统计

java ×1

java-memory-model ×1

jvm ×1

language-lawyer ×1