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---