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 に答える