java鎖升級路線 偏向鎖->輕量級鎖->重量級鎖(互斥量)
1: 正常無鎖狀態(tài)
輕量級鎖未鎖定狀態(tài)
| 25bit | 4bit | 1bit 是否偏向鎖 | 2bit 鎖標志位 |
|---|---|---|---|
| 對象hashcode | 分代年齡 | 0 | 01 |
偏向鎖未鎖定狀態(tài)
| 23bit | 2bit | 4bit | 1bit 是否偏向鎖 | 2bit 鎖標志位 |
|---|---|---|---|---|
| 0 | epoch | 分代年齡 | 1 | 01 |
2: 當A線程要獲得鎖時,進入偏向模式
- 2.1 如果處于無鎖狀態(tài),則鎖對象會更新為
| 23bit | 2bit | 4bit | 1bit 是否偏向鎖 | 2bit 鎖標志位 |
|---|---|---|---|---|
| ThreadA id | epoch | 分代年齡 | 1 | 01 |
- 2.2 若鎖對象處于偏向模式,同時threadId等于自己,則直接進入同步模塊,不需要進行任何線程調(diào)度
3:當另一個B線程要獲得鎖,發(fā)現(xiàn)是偏向模式,并且threadA != threadB
- 3.1 在到達安全點時,threadA暫停,偏向鎖升級為輕量級鎖,這時鎖對象頭會變成
| 30bit | 2bit 鎖標志位 |
|---|---|
| lock record pointer | 00 |
這時在threadA的棧幀中會有個lock record
|hash|age|01|
|owner??????????|