JVM 是否保证缓存非 volatile 变量?

Does JVM guarantee to cache not volatile variable?

JVM 保证缓存非 volatile 变量吗?

程序员能否依靠 JVM 始终为每个线程在本地缓存非易失性变量。

或者 JVM 可能会也可能不会这样做,因此程序员不应为此依赖 JVM。

提前感谢您的回答。

没有。 JVM 不保证 "caching" 的非易失性字段。 JVM 保证的实现是 volatile 字段的行为方式。字段的缓存是非标准的(未指定的)并且可能因 JVM 实现而异。所以,你不应该真的依赖它(即使通过某种方式发现某些数据正在被线程缓存)

java 语言规范对 volatile 非常清楚:

The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes.

A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (§17.4).

就是这样。你有一个 special 关键字来定义这个特殊的语义。因此,当您反过来思考时:如果没有那个特殊关键字,您就不能依赖任何特殊语义。然后你就会得到 Java 内存模型必须提供的东西;但仅此而已。

并且完全正确 - 当然有 Unsafe,允许您以非常特殊的语义以不安全的方式篡改内存。

如果您需要字段的快照,推荐的模式是将其复制到局部变量。这是 commonly used 在编写大量使用原子和读取-修改-条件-写入循环的代码时。