2016-07-21 125 views
1

。例如,我們在一個多線程項目中名爲TestThreadSafe的項目中有一個類。線程安全的實例字段

public class TestThreadSafe { 
    public AtomicLong pCounter = new AtomicLong(); 
    public AtomicLong mCounter = new AtomicLong(); 
    protected final ConcurrentMap<K, V> Map = new ConcurrentHashMap<K, V>(); 
    private ScheduledExecutorService ses; 
    private String dir; 
} 

這裏,爲什麼不把ses和dir定義爲最終或易失性字段?

+0

我們不知道這些領域的使用。如果它們不用於多線程上下文,則不需要volatile。如果你不改變參考,最終不需要 –

+0

TestThreadSafe在困惑實例字段變量修改,哪些字段應該聲明爲final,易揮發或實例字段變量之前別的東西多線程上下文 – lawrence

回答

0

將字段標記爲final(您不會失去任何性能,但獲得編譯時間檢查和線程相關獎金 - 字段將始終賦予值,而不是默認值)。

至於volatile - 它使CPU的優化(高速緩存)消失,因此使用這樣的領域會比較慢。其中一個線程正在將數據寫入它和多個(> = 1)從它讀線程 -

volatile如果共享給定的線程之間的字段值應當被使用。

+0

使用。如何確定和如何決定,是否有一些標準來做到這一點? – lawrence

+0

沒有標準,如果有java會爲你做。你需要看看代碼最終決定你自己。我親自添加最終修飾符並在構造函數中初始化字段。 –

0

重點提示:

  1. 如果你的變量不能由多個線程修改,則不要使用任何
  2. 如果你的變量引用不創建之後改變,使用final
  3. 如果變量是通過單線程修改和其它線程訪問,使用volatile
  4. 如果你的變量修改和訪問由多個線程: 一個。使用AtomicXXX如果你的操作都是原子 - 單步交易 灣使用​​或Lock API,如果你有一個代碼塊之後,要提防

你可以找到關於高級別併發更多的細節構造here

相關SE問題:

What is the difference between atomic/volatile/synchronized?

What is meant by "thread-safe" code?