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

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

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

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

感谢您提前的答案。

不可以.JVM不保证非缓存字段的“缓存”。 JVM的哪些实现保证了volatile字段的行为方式 。 字段缓存是非标准的(未指定),并且可以从JVM到JVM实现不同。 所以,你不应该真的依赖它(即使通过某种方式找出一些线程缓存的数据)

如果需要字段快照,建议的模式是将其复制到本地变量。 在编写大量使用primefaces和读取 – 修改 – 条件 – 写入循环的代码时, 通常会使用此方法。

关于volatile的java语言规范非常清楚:

Java编程语言提供了第二种机制,即volatile字段,比某些用途的锁定更方便。

字段可以声明为volatile,在这种情况下,Java Memory Model可以确保所有线程都看到变量的一致值(第17.4节)。

而已。 你有一个特殊的关键字来定义这个特殊的语义。 所以,当你反思时:如果没有那个特殊的关键字,你就不能依赖任何特殊的语义。 然后你会得到Java Memory Model提供的东西; 但仅此而已。

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