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提供的东西; 但仅此而已。
并且完全正确 – 当然是不安全的 ,允许您以非常特殊的语义以不安全的方式篡改内存。