2009-10-15 59 views
23

我的問題涉及ReentrantLock的使用是否保證字段的可見性與synchronized關鍵字提供的方面相同。通過ReentrantLock訪問字段是否需要volatile關鍵字?

例如,在下面的類,場sharedData不需要作爲同步關鍵字用於聲明揮發性。

class A 
{ 
    private double sharedData; 

    public synchronized void method() 
    { 
    double temp = sharedData; 
    temp *= 2.5; 
    sharedData = temp + 1; 
    } 
} 

對於使用ReentrantLock的下一個示例,但該字段上的volatile關鍵字是必需的嗎?

class B 
{ 
    private final ReentrantLock lock = new ReentrantLock(); 
    private volatile double sharedData; 

    public void method() 
    { 
    lock.lock(); 
    try 
    { 
     double temp = sharedData; 
     temp *= 2.5; 
     sharedData = temp + 1; 
    } 
    finally 
    { 
     lock.unlock(); 
    } 
    } 
} 

我知道無論如何使用volatile關鍵字只會影響性能,但我仍然希望能夠正確編寫代碼。

回答

28

它沒有波動是安全的。 ReentrantLock實現Lock,並且docs for Lock包括這樣的:

所有Lock實現必須執行 同一存儲器的同步通過提供 語義內置 監視器鎖定,以Java 語言規範,第3版 (17.4內存模型):

  • 成功lock操作具有相同 內存同步效果 成功Lock操作。
  • 成功 unlock操作具有相同內存 同步效果爲 成功Unlock操作。
+0

這個建議是否適用於由於現場吊裝而引起的「場(場)」? – Pod 2017-08-21 09:49:16

+0

@Pod:沒有關於'while'循環如何與鎖相互作用的更多具體細節,這是不可能的。你可能想用一個具體的例子來創建一個新的問題。 – 2017-08-21 09:50:35

相關問題