考虑一个简单的单线程 Java 程序执行,不涉及同步操作,只是简单地读取和写入实例变量。简单地忽略所有写入的实现似乎符合 Java 内存规范。首先,来自§17.4的适用一般性陈述:
内存模型决定了程序中每个点可以读取哪些值。每个单独的线程的操作必须按照该线程的语义进行操作,但每次读取看到的值由内存模型确定。
相关限制如下(§17.4.5):
1. 程序顺序引发的happens-before顺序:
如果 x 和 y 是同一线程的操作,并且 x 在程序顺序中位于 y 之前,则为 hb(x, y)。
2.happens-before一致性:
如果对于 A 中的所有读取 r,一组动作 A 在发生之前是一致的,其中 W(r) 是 r 看到的写入动作,但不是 hb(r, W(r)) 或存在在 A 中存在写入 w 使得 wv = rv 和 hb(W(r), w) 和 hb(w, r)。
这基本上排除了在它观察到的写入之前发生读取。另一个条款只是一个理智的条款,它阻止了一些人v
看到之前写v
的同时又写了同样的内容v
。
我找不到任何保证可以肯定地观察到写入,只有对写入内容的限制可能不会被观察到。
我在这里想念什么?JVM真的有可能忽略这样一个微不足道的保证吗?