我知道易变性如何起作用,但问题是如何特别的。我经常听到那些认为自己是多线程专家的人,比如关于易变性如何运作的辩论。
通常对于新手来说解释volatile:每个线程都有自己的cach,其中不同的变量可以存储,但volatile不缓存。 “专家”开始试图变得聪明,并说这绝对是错误的 - 处理器现金不稳定兑现,但挥发性不会兑现处理器注册。
我无法找到有关它的信息。
您能否确认或拒绝此意见?
P.S。我知道java程序员应该知道JMM解决易变的相关问题,但我想得到确切的答案。
答案 0 :(得分:6)
看一下下面的例子。它包含对 volatile 变量的读写操作。但是,最有可能的是,JIT编译器将生成代码,其中变量将始终保存在CPU寄存器中。
final class Int {
public volatile int value;
public Int(int value) { this.value = value; }
}
int sum(int n) {
int result = 0;
for (int i = 0; i < n; ++i) {
result += new Int(i).value;
}
return result;
}
重点是: Java语言规范不讨论CPU寄存器或CPU缓存。它基于抽象机器指定语义。由 Java运行时环境决定在具体机器上以这样的方式执行代码,使其满足规范。如果JIT编译器可以检测到可以在CPU寄存器中保留 volatile 变量,那么就不需要将其写入内存。
答案 1 :(得分:0)
来自http://www.javaperformancetuning.com/news/newtips118.shtml
不能在CPU寄存器中分配volatile变量,这使得 它们的效率低于普通变量。
这不能用于寄存器,因为它们不在处理器上执行的不同线程之间共享。因此,一个线程所做的更改将永远不会被其他人看到。
缓存是内存支持的,可以在处理器之间共享。可以缓存易失性变量,具体取决于体系结构的内存一致性模型和JVM的实现。