3

あなたがこのコードを持っているとしましょう:

private Object lockObject = new Object();
private Integer myValue = new Integer(0);

public void update(){
 synchronized(lockObject){
  System.out.println(myValue);
  myValue++;
 }
}

現在、myValuesynchronizedオンでもマークもされていませんvolatile。ただし、それを変更する唯一の方法は、update()メソッドを使用することです。コアJava同時実行性に関するDZoneのrefcardは、同期化されたブロック内のフィールドへの更新がすべてのスレッドによって認識されることを示しています。これが同期化されたオブジェクトのみ(lockObject)を意味するのか、それとも任意のフィールド(myValueなど)を意味するのかわかりませんでした。

誰かがこれについて詳しく説明できますか?ありがとう!

4

2 に答える 2

8

同期されたブロック内のすべてのフィールド更新は、読み取る前に同じオブジェクトで同期している限り、他のスレッドに表示されることが保証されています。共有された可変状態へのすべてのアクセスを同期する限り、すべての更新が表示されます。

または、実際にカウンターしかない場合は、AtomicInteger:)を使用します。

于 2012-04-11T20:26:53.593 に答える
0

検討:

  1. System.out.println(myValue);同期ブロック内で実行されるThread1は、の現在の値を出力しますmyValue

  2. Thread1がインクリメントするSystem.out.println(myValue); 前に実行されているThread2は、ステップ1myValueと同じ値を取得します。myValue

  3. Thread1myValueは、同期されたブロック内でインクリメントします。

  4. Thread2を実行すると、 Thread1によって設定されたの新しい値System.out.println(myValue); が取得される場合があります。myValue

于 2012-04-11T20:38:20.247 に答える