鎖的公平性是相對於獲取鎖的順序而言的,如果是乙個公平鎖,那麼鎖的獲取順序就應該符合請求的絕對時間順序,也就是fifo。 在上面分析的例子來說,只要cas設定同步狀態成功,則表示當前執行緒獲取了鎖,而公平鎖則不一樣,差異點有兩個
fairsync.tryacquire
final void lock()
非公平鎖在獲取鎖的時候,會先通過cas進行搶占,而公平鎖則不會
fairsync.tryacquire
protected final boolean tryacquire(int acquires)
} else if (current == getexclusiveownerthread())
return false;
}
這個方法與nonfairtryacquire(int acquires)比較,不同的地方在於判斷條件多了hasqueuedpredecessors()方法,也就是加入了[同步佇列中當前節點是否有前驅節點]的判斷,如果該方法返回true,則表示有執行緒比當前執行緒更早地請求獲取鎖,因此需要等待前驅執行緒獲取並釋放鎖之後才能繼續獲取鎖。 公平鎖和非公平鎖
公平鎖和非公平鎖的不同是發生在乙個新的執行緒搶占乙個鎖的情況下。1.對於非公平鎖,當乙個新的執行緒想要得到乙個鎖,而這時鎖恰好沒有被別的執行緒占有,那麼這時候這個新的執行緒就可以無視其他執行緒在等待佇列中的排隊,而直接獲取這個鎖,而且不用先加入等待佇列。2,公平鎖,就是乙個新的執行緒想要得到乙個鎖,...
公平鎖和非公平鎖
所謂公平鎖指的是哪個執行緒先執行,那就可以先得到鎖。非公平鎖是不管執行緒是否是先執行,上來就直接嘗試占有鎖,如果嘗試失敗,就再採用類似公平鎖那種方式。我們看下reentrantlock 類的原始碼 公平鎖 protected final boolean tryacquire int acquires...
公平鎖和非公平鎖
三 reentrantlock非公平鎖 三 reentrantlock公平鎖 有個小夥伴最近諮詢我,前段時間他被面試官問了synchronized是公平鎖還是非公平鎖?當時就矇圈了,最後面試結果可想而知,今天我們就用乙個通俗的案例加上 來說明公平鎖和非公平鎖。其實公平鎖這個概念是juc工具包才有的,...