【发布时间】:2023-07-15 08:27:02
【问题描述】:
我认为 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);
}
}
...然后方法二偶尔会打印出大于 i 值的 j 值,因为该示例不包括同步,并且根据第 17.4 节中解释的规则,i 和 j 的共享值可能是乱序更新。
我认为即使这些更新是有序的,方法二仍然可能看到 j 大于 i,因为 System.out.println("i=" + i + " j=" + j) 不是原子的,并且 i 在 j 之前被读取。
方法二同理
read i
read j
所以有可能
read i
i++
j++
read j
在这种情况下,方法二看到 j 的值大于 i,但更新不会乱序。
所以乱序并不是看到 j > i 的唯一原因
应该是System.out.println("j=" + j + " i=" + i);吗?
这次乱序是唯一看到j>i的原因
【问题讨论】:
-
你的 volatile 变量在哪里?易失性也是存储在主存储器中的一种,所有进程都直接访问它们。对于静态,有一个共享给所有进程的副本
-
不明白你的问题,但 JLS 的解释对我来说是正确的。
-
@RobbyCornelissen 更新了我的问题
-
@Vipul 这与易失性无关......
-
@curiousguy 进程在这里线程
标签: java jvm language-lawyer java-memory-model