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

时间:2017-05-15 07:08:25

标签: java multithreading jvm java-memory-model non-volatile

JVM是否保证不缓存不稳定变量?

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

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

提前感谢您的答案。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

java语言规范非常清楚volatile

  

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

     

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

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

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

答案 2 :(得分:0)

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