2017-02-23 61 views
0

這個問題涉及JMM: https://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf微妙的時刻,在之前發生關係

能否請您解釋一下從JMM規範下面的表達式(這是第13頁的第5節):

更具體地說如果兩個動作共享之前發生的關係,那麼它們不一定必須按照 的順序發生,以致它們不與任何發生在 之間的關係發生共享的代碼發生。在另一個線程中,在一個數據競賽中寫入 的線程可能會出錯,例如,這些讀取可能不按順序發生到 。

如果可能請提供反映此問題的執行跟蹤。

回答

0

您引用的段落前面的段落指出,動作a與事件b之間發生關係的事實並不意味着a在b之前真正執行。例如,在代碼片段

x = 10; 
y = 20; 

兩個寫入操作是因爲它們發生在同一個線程的之前發生關係。但是,它們實際上可能會被交換(由編譯器,JVM甚至處理器),因爲這種交換不能從線程內部觀察到。

但是,它可以被另一個線程觀察到(這是Java內存模型特別允許的)。因此,另一個讀取這兩個變量的線程,在沒有某種形式的同步的情況下,可以觀察到在x變爲10之前,y被更改爲20.(同步的缺乏可以確保寫入與數據競爭中的讀取其他線程)

相關問題