鎖的狀態(tài)總共四種:無鎖狀態(tài)异吻、偏向鎖、輕量級鎖和重量級鎖开皿。隨著鎖的競爭涧黄,鎖可以從偏向鎖升級到輕量級鎖篮昧,再升級到重量級鎖(但是鎖的升級是單向的,也就是說只能從低級到高級笋妥,不會出現(xiàn)鎖降級)懊昨。JDK1.6中默認開啟偏向鎖和輕量級鎖的,我們也可以通過-XX:-UseBiasedLocking來禁用偏向鎖春宣。
偏向鎖
- 定義:
Java6引入的一項多線程優(yōu)化酵颁。它通過消除無競爭情況下的同步原語,進一步提高程序的運行性能月帝。這里所謂的無競爭場景指的是單線程訪問帶同步的資源或方法躏惋。
- 實現(xiàn)原理:
偏向鎖,顧名思義嚷辅,它會偏向第一個訪問鎖的線程簿姨,如果在接下來的運行過程中,該鎖沒有被其他的線程訪問簸搞,則持有偏向鎖的線程將永遠不需要觸發(fā)同步扁位。如果在運行過程中,遇到了其他線程搶占鎖趁俊,則持有偏向鎖的線程會被掛起域仇,JVM會嘗試消除它身上的偏向鎖,將鎖恢復到標準的輕量級鎖寺擂。
- 具體流程:
- 評價
在JDK6中暇务,偏向鎖是默認啟用的。它提高了單線程訪問同步資源的性能怔软。但如果你的同步資源或代碼一直都是多線程訪問的垦细,那么消除偏向鎖這一步驟對此時多余的。事實上爽雄,消除偏向鎖的開銷還是蠻大的蝠检,因此沐鼠,我們可以通過-XX:-UseBiasedLocking來禁用偏向鎖挚瘟。
輕量級鎖
- 定義:
輕量級鎖本意是為了減少多線程進入互斥的狀態(tài),并不是要代替互斥饲梭。它利用CPU原語Compare-Add-Swap(CAS)乘盖,嘗試在進入互斥體前,進行補救憔涉。
- 具體實現(xiàn)流程
- 輕量級鎖與偏向鎖的區(qū)別
輕量級鎖也是一種多線程優(yōu)化订框,它與偏向鎖的區(qū)別在于,輕量級鎖是通過CAS來避免進入開銷較大的互斥操作兜叨,而偏向鎖是在無競爭場景下完全消除同步穿扳,連CAS也不執(zhí)行(CAS本身仍舊是一種操作系統(tǒng)同步原語衩侥,始終要在JVM與OS之間來回,有一定的開銷)矛物。