圍繞synchronize關鍵字說下三個鎖升級
無鎖 -> 偏向鎖 -> 輕量級鎖 -> 重量級鎖
1,Mark Word
2,指向類的指針
3,數組長度(只有數組對象纔有)
鎖的信息都是放在對象頭的mark word裏面的,具體信息如下:
【說個小知識點 yc的年齡最大的是15 cms默認的是6,4bit的最大就是15】
1.無鎖態,一個對象沒有被爭搶,裏面會記錄對象的hash等信息
2.有線程來爭搶,搶到鎖後jvm會把持有鎖的線程id記錄到mark word裏面。針對可重入鎖 或者併發小的情況,偏向鎖還是蠻好的。併發度比較大的情況下,需要停止偏向鎖。 -usebiasedLock。
3.多線程爭搶時 會升級成輕量級鎖,這個時候爭搶鎖的線程會在自己的線程棧裏面生成lockRecord(裏面會記錄原先 hashcode的信息)大家通過cas來更新mark word裏面的信息
4.自旋次數到達10次,或者會升級成重量級鎖。 重量級鎖就動用到了操作系統的原語。java變異看到的就是 monitorEnter monitorExist。這個時候鎖是由操作系統來分配的,不同的操作系統 底層的指令也不是相同的(輕量級鎖爲啥要升級成重量級鎖 還是比較簡單的,這個可以想下)