Java并發(fā)編程的藝術(shù)》 —3.5.3 鎖內(nèi)存語義的實(shí)現(xiàn)">《Java并發(fā)編程的藝術(shù)》 —3.5.3 鎖內(nèi)存語義的實(shí)現(xiàn)
701
2025-03-31
3.5.2 鎖的釋放和獲取的內(nèi)存語義
當(dāng)線程釋放鎖時(shí),JMM會(huì)把該線程對應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中。以上面的MonitorExample程序?yàn)槔?,A線程釋放鎖后,共享數(shù)據(jù)的狀態(tài)示意圖如圖3-25所示。
圖3-25 共享數(shù)據(jù)的狀態(tài)示意圖
當(dāng)線程獲取鎖時(shí),JMM會(huì)把該線程對應(yīng)的本地內(nèi)存置為無效。從而使得被監(jiān)視器保護(hù)的臨界區(qū)代碼必須從主內(nèi)存中讀取共享變量。圖3-26是鎖獲取的狀態(tài)示意圖。
圖3-26 鎖獲取的狀態(tài)示意圖
對比鎖釋放-獲取的內(nèi)存語義與volatile寫-讀的內(nèi)存語義可以看出:鎖釋放與volatile寫有相同的內(nèi)存語義;鎖獲取與volatile讀有相同的內(nèi)存語義。
下面對鎖釋放和鎖獲取的內(nèi)存語義做個(gè)總結(jié)。
線程A釋放一個(gè)鎖,實(shí)質(zhì)上是線程A向接下來將要獲取這個(gè)鎖的某個(gè)線程發(fā)出了(線程A對共享變量所做修改的)消息。
線程B獲取一個(gè)鎖,實(shí)質(zhì)上是線程B接收了之前某個(gè)線程發(fā)出的(在釋放這個(gè)鎖之前對共享變量所做修改的)消息。
線程A釋放鎖,隨后線程B獲取這個(gè)鎖,這個(gè)過程實(shí)質(zhì)上是線程A通過主內(nèi)存向線程B發(fā)送消息。
Java
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。