Java并發編程的藝術》 —3.5.3 鎖內存語義的實現">《Java并發編程的藝術》 —3.5.3 鎖內存語義的實現
730
2025-03-31
3.5 鎖的內存語義
眾所周知,鎖可以讓臨界區互斥執行。這里將介紹鎖的另一個同樣重要,但常常被忽視的功能:鎖的內存語義。
3.5.1 鎖的釋放-獲取建立的happens-before關系
鎖是Java并發編程中最重要的同步機制。鎖除了讓臨界區互斥執行外,還可以讓釋放鎖的線程向獲取同一個鎖的線程發送消息。
下面是鎖釋放-獲取的示例代碼。
class MonitorExample {
int a = 0;
public synchronized void writer() {????????? // 1
a++;?????????????????????????????? // 2
}?????????????????????????????????????? // 3
public synchronized void reader() {???????? // 4
int i = a;???????????????????????? // 5
……
}?????????????????????????????????????? // 6
}
假設線程A執行writer()方法,隨后線程B執行reader()方法。根據happens-before規則,這個過程包含的happens-before關系可以分為3類。
1)根據程序次序規則,1 happens-before 2, 2 happens-before 3; 4 happens-before 5, 5 happens -before 6。
2)根據監視器鎖規則,3 happens-before 4。
3)根據happens-before的傳遞性,2 happens-before 5。
上述happens-before關系的圖形化表現形式如圖3-24所示。
圖3-24 happens-before關系圖
在圖3-24中,每一個箭頭鏈接的兩個節點,代表了一個happens-before關系。黑色箭頭表示程序順序規則;橙色箭頭表示監視器鎖規則;藍色箭頭表示組合這些規則后提供的happens-before保證。
圖3-24表示在線程A釋放了鎖之后,隨后線程B獲取同一個鎖。在上圖中,2 happens-before 5。因此,線程A在釋放鎖之前所有可見的共享變量,在線程B獲取同一個鎖之后,將立刻變得對B線程可見。
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。