偏向鎖的定義
顧名思義,偏向鎖會偏向第一個訪問鎖的執行緒。
如果在接下來的執行過程中,該鎖沒有被其他執行緒訪問,這持有偏向鎖的執行緒將永遠不需要同步
如果在執行過程中,遇到了其他執行緒搶佔鎖,則持有偏向鎖的執行緒會被掛起,JVM會嘗試消除他身上的偏向鎖,將鎖恢復到標準的輕量級鎖(CAS),也就是說,偏向鎖,只在單執行緒環境下起作用
當鎖物件第一次被執行緒獲取的時候,虛擬機器會將該物件頭部的mardword中的標示位設定為01,即偏向模式。將該執行緒的id存在markword中,成功之後,持有該鎖的執行緒以後就不再進行任何同步操作,但是在另外一個執行緒嘗試獲該鎖的時候,這個偏向模式宣告結束
偏向鎖針對的場景
偏向鎖是為了針對“大多數情況下,鎖不僅不存在多執行緒競爭,而且總由同一個執行緒獲取”的情況
這是為了對那些歷史遺留的Collectionn類如Vector和HashTable等類做的優化。
偏向鎖的問題
偏向鎖撤銷的代價很大,需要進入safepoint,如果是競爭十分激烈的多執行緒程式,一開始就關掉偏向鎖是一個比較好的選擇
safepoint:safepoin是一個安全點,所有執行緒執行到安全點的時候就會去檢查,是否需要執行safepoint操作,如果需要執行,那麼所有執行緒就會的等待,直到所有執行緒進入到safepoint。
緊接上面說的問題,撤銷偏向鎖的時候需要所有執行緒都阻塞等到進入safepoint,這種開銷無疑是巨大的,尤其是在鎖競爭激烈的多執行緒程式中,偏向鎖會影響到程式的執行效率,這也是為什麼在jdk15中,已經預設關閉了偏向鎖模式