gst*_*low 2 java cpu concurrency caching volatile
我知道波动是多么有效,但问题是如何特别的.我经常听到那些自称为多线程专家的人,比如关于波动性如何起作用的辩论.
通常对于新手来说解释volatile:每个线程都有自己的cach,其中不同的变量可以存储,但volatile不缓存."专家"开始试图变得聪明,并说它绝对是错误的 - 处理器现金不稳定兑现,但挥发性不能兑现处理器注册.
我找不到有关它的信息.
你能证实或拒绝这个意见吗?
PS我知道java程序员应该知道JMM解决易变的相关问题,但我想得到确切的答案.
看一下下面的例子.它包含对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;
}
Run Code Online (Sandbox Code Playgroud)
关键是:Java语言规范不讨论CPU寄存器或CPU缓存.它基于抽象机器指定语义.由Java Runtime Environment以这种方式在具体机器上执行代码,它满足规范.如果JIT编译器可以检测到可以将易失性变量保存在CPU寄存器中,则无需将其写入内存.