2015-10-06 14 views
5

変数emittingは揮発性になりますか? emit()メソッドが異なるスレッドから呼び出され、emitが可視である必要があります。
しかし、それは​​ブロックでのみアクセスされます。 // ...は作業が行われる場所ですが、ここではemittingは参照されません。同期アクセスのみの場合、揮発性が必要です

したがって、​​の構造が修正されている場合は、emittingにはまだvolatileが必要ですか? (その理由は?)

static final class C { 
    boolean emitting = false; // shall be volatile ? 

    public void emit() { 
     synchronized (this) { 
      if (emitting) { 
       return; 
      } 
      // ... 
      emitting = true; 
     } 

     // ... 

     synchronized (this) { 
      if (!condition()) { 
       emitting = false; 
       return; 
      } 
     } 
     // ... 
    } 

フランク

答えて

5

を、それが唯一の​​ブロックからアクセスされる場合は、volatileキーワードを必要とされていません。

同期化されたブロック内でアクセスされる変数への変更は、同期化ブロックに入るすべてのスレッドから参照できます。オブジェクト安全を公開する

、両方 オブジェクトとオブジェクトの状態への参照は同じで、他の のスレッドに見えるようにする必要があります:実際で書籍のJava並行処理から

時間。正しく構築されたオブジェクトは、次の方法で安全に公開できます。

  • 静的初期化子からオブジェクト参照を初期化します。
  • 揮発性フィールドまたはアトミックリファレンス に参照を格納しています。
  • 適切に構築されたオブジェクトの最終フィールドにそれへの参照を格納する。
  • がロックで保護されているフィールドに参照を格納しています

注:手段は、同期ブロック

に入力されたロックによって守ら
関連する問題