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

时间:2014-07-04 17:55:10

标签: java caching concurrency cpu volatile

我知道易变性如何起作用,但问题是如何特别的。我经常听到那些认为自己是多线程专家的人,比如关于易变性如何运作的辩论。

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

我无法找到有关它的信息。

您能否确认或拒绝此意见?

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

2 个答案:

答案 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的实现。