1

如题。我使用同步来保护多线程写入。但我想知道是否需要添加 volatile 来保护读取。(正如我们所知,我也可以使用同步来保护读取,但它会阻止读取和写入一致。更重要的是,如果我使用可重入锁。它也会阻止。)

private volatile BigDecimal cacheMiss = BigDecimal.ZERO;

public  BigDecimal getCacheHit() {
    return cacheHit;
}

public void increaseCacheMiss() {
    synchronized (cacheMissLock) {
        this.cacheMiss = this.cacheMiss.add(STEP);
    }
}
4

1 回答 1

2

如果cacheMiss可以从多个线程更新,那么volatile如果您绝对需要读取最新值,则需要声明它。否则,线程可能正在读取线程本地值(隐藏在寄存器或核心缓存中),而不会费心去主内存查看最新值。

于 2012-06-06T05:32:16.197 回答