Java 偏向鎖(Biased Locking)是Java引入的一項多線程優化它通過消除資源無競爭情況下的同步原語進一步提高了程序的運行性能
輕量級鎖也是一種多線程優化它與偏向鎖的區別在於輕量級鎖是通過CAS來避免進入開銷較大的互斥操作而偏向鎖是在無競爭場景下完全消除同步連CAS也不執行(CAS本身仍舊是一種操作系統同步原語始終要在JVM與OS之間來回有一定的開銷)
所謂的無競爭場景舉個例子就是單線程訪問帶同步的資源或方法
偏向鎖實現原理
偏向鎖顧名思義它會偏向於第一個訪問鎖的線程如果在接下來的運行過程中該鎖沒有被其他的線程訪問則持有偏向鎖的線程將永遠不需要觸發同步
如果在運行過程中遇到了其他線程搶占鎖則持有偏向鎖的線程會被掛起JVM會嘗試消除它身上的偏向鎖將鎖恢復到標准的輕量級鎖(偏向鎖只能在單線程下起作用)
通過下圖可以更直觀的理解偏向鎖
這張圖省略了輕量級鎖相關的幾處步驟將關注點更多地聚焦在偏向鎖的狀態變化上
偏向模式和非偏向模式 在下面的mark word表中主要體現在thread ID字段是否為空
掛起持有偏向鎖的線程 這步操作類似GC的pause但不同之處是它只掛起持有偏向鎖的線程(非當前線程)
在搶占模式的橙色區域說明中有提到指向當前堆棧中最近的一個lock record(在輕量級鎖原理一文有講到lock record是進入鎖前會在stack上創建的一份內存空間)
這裡提到的最近的一個lock record其實就是當前鎖所在的stack frame上分配的lock record
整個步驟是從偏向鎖恢復到輕量級鎖的過程
偏向鎖也會帶來額外開銷
在JDK中偏向鎖是默認啟用的它提高了單線程訪問同步資源的性能
但試想一下如果你的同步資源或代碼一直都是多線程訪問的那麼消除偏向鎖這一步驟對你來說就是多余的事實上消除偏向鎖的開銷還是蠻大的
所以在你非常熟悉自己的代碼前提下大可禁用偏向鎖 XX:UseBiasedLocking
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26625.html