1 回答

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