1 回答

TA貢獻1828條經驗 獲得超3個贊
為了弄清楚提供了哪些可見性保證,您需要更好地理解 Java 內存模型,更具體地說,在 JMM 的上下文中 happens-before 意味著什么。JMM 將發生的事情描述為actions,例如,正常的讀寫、volatile 讀寫、鎖定、解鎖等。
JMM 中有一些規則確定一個動作何時先于另一個動作發生。與您的情況相關的規則如下:
單線程規則:在給定線程中,如果 A 在程序順序中先于 B,則操作 A 發生在操作 B 之前。
監視器鎖定規則(同步):給定監視器的解鎖發生在同一監視器上的后續鎖定之前。
重要的是要知道happens-before是傳遞性的,即如果 hb(a, b) 和 hb(b, c),則 hb(a, c)。
在您的示例中,一個線程在退出時釋放監視器syncronizedMethodA()
,而另一個線程隨后在進入時獲取監視器syncronizedMethodB()
。那是一種先發生后關系。由于 HB 是可傳遞的,因此執行的操作syncronizedMethodA()
對于隨后進入的任何線程都是可見的syncronizedMethodB()
。
另一方面,在釋放監視器syncronizedMethodA()
和由另一個線程執行的后續操作之間不存在先行關系notSynchronizedMethod()
。因此,無法保證寫入syncronizedMethodA()
對另一個線程的讀取可見notSynchronizedMethod()
。
添加回答
舉報