考慮以下情況下重新排序的情況下,兩個同步塊和多個易失性讀/寫
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比蟑螂屋型號弱?
謝謝@約翰。所以,如果我總結上面的情況1實際上會阻止重新排序的行動#1和行動#2我是嗎? – veritas
@veritas是的,因爲(正如在網格中提到的),一個'VolatileLoad'不能重新排序到'NormalLoad'或'NormalStore'。在情況1中,'volatile read var 1'滿足這個條件。 –