2015-10-06 67 views
5

難道emitting變量是volatile嗎? emit()方法從不同的線程調用,並且發射必須可見。
但它僅在​​塊中訪問。 // ...是工作完成的地方,但emitting未在此處引用。是否需要volatile,以防止同步訪問

因此,如果​​的結構已修復,那麼對於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併發在實踐中

要發佈對象安全,無論是參照 對象和對象的狀態必須以相同的是可見的其他 線程時間。正確構造的對象可以通過以下方式安全地發佈:

  • 從靜態初始化程序初始化對象引用;
  • 將引用存儲到易失性字段或原子參考中 ;
  • 將引用存儲到正確構造的對象的最終字段中;
  • 將引用存儲到正確的字段由鎖保護。

注:通過鎖定把守輸入在同步塊裝置

相關問題