java鎖-偏向鎖

偏向鎖: HotSpot作者發現,大多數情況下,鎖不僅不存在多線程競爭,而且總是由同一線程多次獲得,爲了讓線程獲取鎖的代價更低,引入了偏向鎖,當一個線程訪問同步塊並獲取鎖時,會在對象頭和棧貞中的鎖記錄裏存儲鎖偏向的線程id,以後該線程進入和退出該同步塊時,不需要進行CAS操作來獲取和釋放鎖,只需簡單的測試一下對象頭的Mark Word裏是否存儲着指向當前線程的偏向鎖,如果測試成功,表明線程已經獲得了該鎖,如果測試失敗,則需再測試一下Mark Word中偏向鎖的標識是否設置爲1(表示當前是偏向鎖),如果沒有設置,則使用CAS來競爭鎖,如果設置了,則嘗試使用CAS將對象頭的偏向鎖指向當前線程.

    偏向鎖的撤銷:

偏向使用了一種等到競爭出的機制,所以當其他嘗試競爭偏向鎖時
持有偏向程纔會。偏向的撤,需要等待全局安全點(在時間點上沒有正
行的字節碼)。它會首先有偏向程,然後檢查持有偏向程是否活着,
如果程不於活頭設置成無;如果程仍然活着,有偏向
會被行,遍偏向象的鎖記錄中的鎖記錄Mark Word要麼重新偏向於其他
程,要麼恢復到無或者標記對象不適合作偏向,最後停的程。
 
關閉偏向鎖:
           
偏向Java 6Java 7裏是默啓用的,但是它在用程序啓幾秒之後才激活,如
有必要可以使用JVM參數來關:-XX:BiasedLockingStartupDelay=0。如果你確定用程
序裏所有的通常情況下爭狀,可以通JVM參數關偏向:-XX:- UseBiasedLocking=false,那麼程序默級鎖
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章