volatileを使用することを決定するとき、実際のロックの問題はありますか?

Say I have the following code:

private Integer number;
private final Object numberLock = new Object();

public int get(){
    synchronized(number or numberLock){
        return Integer.valueOf(number);
     }
}

私の質問は、以下のバージョンの add メソッドは、以下のような場合に number

public void add(int num){
    synchronized(number)
        number = number + num;
}

public void add(int num){
    synchronized(numberLock)
        number = number + num;
}

これらはどちらも基本的な操作であることを理解していますが、私の質問は、 number の値がグローバルメモリにプッシュアウトされ、volatileを使用せずにすべてのスレッドに表示されることです。

7
@本当に、単純な例を作ることを試みていた:)
追加された 著者 Shawn,
整数をオンにすることは良い考えではありません。整数オブジェクト(缶)はキャッシュに入れられ、同じ番号で同期する他のコードをブロックします。
追加された 著者 Jim,

2 答え

はグローバルメモリにプッシュアウトされ、volatileを使わずにすべてのスレッドに表示される数字の値です。

はい。同期によって可視性も提供されます。実際には同期は可視性とアトミック性を提供しますが、可視性のみが変動します。

10
追加された
さて、あなたに感謝
追加された 著者 Shawn,
@PeterLawreyはお世辞! THX
追加された 著者 Eugene,
+1: synchronized は、 volatile を重複させることができます。
追加された 著者 Peter Lawrey,
@Eugene:erf、ここでは私にとっては遅いですが... ...秒間待つ:私は取得メソッドで同期していません。 OPは、取得追加の両方を同期させる必要があります。 AFAICT(それは私にとっては遅いですが)OPの例では、 get には同期メカニズムがまったく使用されていないことがわかります。
追加された 著者 TacticalCoder,

同期していないので、コードはスレッドセーフではありません。

public int get(){
    return Integer.valueOf(number);
}

それとは別に、Eugeneがすでに指摘しているように、同期によって可視性が保証されます。

1
追加された
良いキャッチ - 追加
追加された 著者 Shawn,