2013-07-08 23 views
1

考慮以下情況下重新排序的情況下,兩個同步塊和多個易失性讀/寫

Case 1: 
action#1 
volatile read var 1 
volatile write var 1 
volatile read var 2 
volatile write var 2 
action#2 

我們能說與動作#2的動作#1的重新排序爲殼體1的上方

Case 2: 
action#1 
synchronized(new Object()){} 
synchronized(new Object()){} 
action#2 

對於上面的案例2,我們可以說關於#1行動與#2行動的重新排序。

對於案例2我已經從問題 Is this a better version of Double Check Locking without volatile and synchronization overhead本課題.The回答說情況2重新排序動作#2和行動#1之間可能的,因爲JMM比蟑螂屋型號較弱的模型答案。爲此我認爲zhong.j.yu是正確的。

但是現在我從以下問題的答案 Valid reorderings - under new JMM得到了一些矛盾。 這顯示了一個嚴格的羅奇汽車旅館模型。

For Orignal Code 

    instanceVar1 = value ;// normal read operation, no volatile 
    synchronized(this) { 
     instanceVar2 = value2; //normal read operation, no volatile 
    } 
    instanceVar3 = value3; //normal read operation, no volatile 

The below Ordering is not possible 

Case 4: 

    instanceVar3 = value3; //normal read operation, no volatile 
    synchronized(this) { 
     instanceVar2 = value2; //normal read operation, no volatile 
    } 
    instanceVar1 = value ;// normal read operation, no volatile 

這也從傑里米·曼森博客文章 http://jeremymanson.blogspot.co.uk/2007/05/roach-motels-and-java-memory-model.html

如下此外,我想指出的是編譯器,同時優化代碼,包括內存屏障受到限制。 請參閱:http://jeremymanson.blogspot.in/2009/06/volatile-arrays-in-java.html 其中** arr = arr冗餘讀取和寫入未優化,因爲arr 是易失性參考**。

我想說的兩個問題 的答案在性質上有點矛盾,都似乎是正確的。 問題1:Valid reorderings - under new JMM 問題2:Is this a better version of Double Check Locking without volatile and synchronization overhead

我們將如何決定在這一點JMM比蟑螂屋型號弱?

回答

3

問題1:

的參考換個好點的是Reodering Grid(我經常引用在這裏)。這裏說的有用的是NormalLoad後跟MonitorExit不能重新排序。在這種情況下instanceVar1 = value ;正常負荷不能重新排序WRT到synchronized(this) {

問題2監視器退出:

在它似乎違背了臉。但是它真正的意思是,因爲沒有其他線程可以與對象同步(因爲你正在做new Object),那麼它有理由認爲沒有必要擔心多線程,因此能夠移除和重新排序圍繞​​方法。

這是基於Lock Elision背後的想法。


揮發性自參照讀/寫 - 因爲據我所知是沒有刪除死代碼的易失性存儲器,即使它是與自身存儲,所以編譯器仍然需要考慮排序規則爲不穩定的商店。

+0

謝謝@約翰。所以,如果我總結上面的情況1實際上會阻止重新排序的行動#1和行動#2我是嗎? – veritas

+0

@veritas是的,因爲(正如在網格中提到的),一個'VolatileLoad'不能重新排序到'NormalLoad'或'NormalStore'。在情況1中,'volatile read var 1'滿足這個條件。 –

2

我認爲你正在應對無關信息的重載。出於所有實際目的,JMM與Roach Motel模型一樣強大。在你的情況2中的一個小例外只是因爲鎖定顯然不可能被任何其他線程獲得,所以整個​​塊只是一個balast。 JVM被允許假裝從未見過它。

JVM必須保證的是,寫入易失性程序順序之前的所有寫入操作必須可以由讀取易失性值的另一個線程(分別爲鎖定釋放/獲取操作的類似保證)觀察到。除非您是JIT編譯器實現者,否則在實踐中如何確保這一點很簡單。

相關問題