1

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

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

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

感谢您提前回答。

4

3 回答 3

4

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

于 2017-05-15T07:11:58.193 回答
1

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

于 2017-05-15T13:42:29.953 回答
1

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

Java 编程语言提供了第二种机制,即 volatile 字段,在某些情况下它比锁定更方便。

一个字段可能被声明为 volatile,在这种情况下,Java 内存模型确保所有线程都看到变量的一致值(第 17.4 节)。

而已。你有一个特殊的关键字来定义这个特殊的语义。所以,当你反过来想:没有那个特殊的关键字,你就不能依赖任何特殊的语义。然后你会得到 Java 内存模型所提供的东西;但仅此而已。

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

于 2017-05-15T07:33:02.007 回答