JVM 是否保证缓存非 volatile 变量?
程序员能否依赖 JVM 始终为每个线程在本地缓存非易失性变量。
或者 JVM 可能会也可能不会这样做,因此程序员不应该依赖 JVM。
感谢您提前回答。
JVM 是否保证缓存非 volatile 变量?
程序员能否依赖 JVM 始终为每个线程在本地缓存非易失性变量。
或者 JVM 可能会也可能不会这样做,因此程序员不应该依赖 JVM。
感谢您提前回答。
不,JVM 不保证非易失性字段的“缓存”。JVM 保证的实现是volatile 字段的行为方式。字段的缓存是非标准的(未指定),并且可能因 JVM 不同而异。因此,您不应该真正依赖它(即使以某种方式发现某些数据正在被线程缓存)
如果您需要字段的快照,推荐的模式是将其复制到局部变量。这通常在编写大量使用原子和读-修改-条件-写循环的代码时使用。
Java 语言规范对volatile非常清楚:
Java 编程语言提供了第二种机制,即 volatile 字段,在某些情况下它比锁定更方便。
一个字段可能被声明为 volatile,在这种情况下,Java 内存模型确保所有线程都看到变量的一致值(第 17.4 节)。
而已。你有一个特殊的关键字来定义这个特殊的语义。所以,当你反过来想:没有那个特殊的关键字,你就不能依赖任何特殊的语义。然后你会得到 Java 内存模型所提供的东西;但仅此而已。
并且完全正确 - 当然有Unsafe,允许您以非常特殊的语义以不安全的方式篡改内存。