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