是不是真的,不能在CPU寄存器中缓存volatile?

gst*_*low 2 java cpu concurrency caching volatile

我知道波动是多么有效,但问题是如何特别的.我经常听到那些自称为多线程专家的人,比如关于波动性如何起作用的辩论.

通常对于新手来说解释volatile:每个线程都有自己的cach,其中不同的变量可以存储,但volatile不缓存."专家"开始试图变得聪明,并说它绝对是错误的 - 处理器现金不稳定兑现,但挥发性不能兑现处理器注册.

我找不到有关它的信息.

你能证实或拒绝这个意见吗?

PS我知道java程序员应该知道JMM解决易变的相关问题,但我想得到确切的答案.

nos*_*sid 7

看一下下面的例子.它包含对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寄存器中,则无需将其写入内存.

  • @gstackoverflow你需要了解汇编程序才能理解证明:) (3认同)