管理博文 heima併發-----75-96---第四章

Monitor是操作系統的對象。在對象的對象頭用指針關聯的。

輕量級鎖是指向鎖記錄的指針,在棧內存裏面的。

基本的原理:

---75---

字節碼角度的Monitor

---76-78---

每個線程的棧幀都會包含一個鎖記錄的信息。

左邊的是棧幀的鎖對象分爲:存的是加鎖對象的Mark word和對象的指針。

輕量級鎖升級爲重量級鎖:

1.加輕量級鎖時候cas替換失敗

2.解鎖

---79---

鎖的膨脹:

重量級鎖的地址後兩位就變成10了。

---80---

自旋優化。

---81---

偏向鎖。

代碼驗證偏向鎖的結論:

只是表示啓用還是禁用。

對象創建之後就有偏向鎖了。

注意優先加的是偏向鎖。

注意第三行,以後就存這這個id了,這就是偏向鎖得名的原因。

默認是偏向鎖。

結論:優先級是有偏向鎖就採用的是偏向鎖,如果其他線程用的話就撤銷偏向鎖,用輕量級鎖,有競爭就膨脹爲重量級鎖。

關於hashCode:

加的是輕量級鎖。

重量級鎖的hashcode:存在Monitor對象,解鎖會還原回來。

輕量級鎖的hashcode:存在線程棧幀的鎖記錄。

---82-83---

偏向鎖和升級輕量級鎖有一個前提是錯開的,競爭的話爲重量級鎖。

解讀:

1.處於可偏向的狀態。

2.加鎖,前面有線程的id了。

3.解鎖,線程的id依然保留。

4.初始化依然是偏向鎖不變。

5.喚醒t2線程執行,本來線程是偏向t1線程的,現在t2線程也想來,偏向鎖失效,變爲輕量級鎖,變成鎖記錄的指針指向棧。

6.變爲不可偏向的。

---84---

代碼:

撤銷的次數多了 會偏向的t2中去。閾值是20。

之後變爲輕量級鎖,然後變爲normal。

---36---

代碼:

第40個變爲不可偏向狀態。

---37---

鎖消除的優化。

---38---

wait和notify的小故事。

waitSet和EntryList。

---39---

代碼:

---40-41---

---

---42-43---

代碼:

---93---

---94---

---95---

最後的解決方案:

---96---

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章