何謂公平鎖與非公平鎖

2021-10-08 21:27:42 字數 1207 閱讀 9397

公平鎖:多個執行緒按照申請鎖的順序去獲得鎖,執行緒會直接進入佇列去排隊,永遠都是佇列的第一位才能得到鎖

非公平鎖:多個執行緒去獲取鎖的時候,會直接去嘗試獲取,獲取不到,再去進入等待佇列,如果能獲取到,就直接獲取到鎖。鎖優點

缺點公平鎖

所有執行緒都會獲得鎖,不會餓死

要喚醒阻塞的執行緒,cpu喚醒執行緒開銷大

吞吐量下降––

–不公平鎖

減少cpu喚醒執行緒的開銷

吞吐效率較高

多個執行緒競爭,可能由於搶不到鎖導致餓死

在reentrantlock章節,其實涉及到了公平鎖與非公平鎖,下面我們來回顧一下

我們平時new 的reentrantlock的時候,它的底層就使用了公平鎖和非公平鎖

public

reentrantlock()

public

reentrantlock

(boolean fair)

細看公平鎖與非公平鎖的原始碼,發現都繼承了reentrantlock的內部類sync,而sync繼承aqs(abstractqueuedsynchronizer)

公平鎖與非公平鎖的主要的處理邏輯在tryacquire方法上,而唯一的不同就在於公平鎖多了乙個hasqueuedpredecessors方法的判斷 。

protected

final

boolean

tryacquire

(int acquires)

}else

if(current ==

getexclusiveownerthread()

)return

false;}

}

進入hasqueuedpredecessors方法,看看是怎麼一回事

public

final

boolean

hasqueuedpredecessors()

大概意思就是判斷當前執行緒是否是在同步佇列的頭部,是返回true,不是返回false

因為公平鎖是同步佇列的首部才可以獲取鎖,所以才多了乙個判斷,非公平鎖不需要

公平鎖與非公平鎖

在reentrantlock中很明顯可以看到其中同步包括兩種,分別是公平的fairsync和非公平的nonfairsync。公平鎖的作用就是嚴格按照執行緒啟動的順序來執行的,不允許其他執行緒插隊執行的 而非公平鎖是允許插隊的。預設情況下reentrantlock是通過非公平鎖來進行同步的,包括syn...

公平鎖與非公平鎖

公平鎖與非公平鎖即fairsybc和nonfairsync。簡單說一下兩個鎖的區別 顧名思義,公平就是先到先得,比如a和b執行緒均需要獲得乙個鎖,但是此時鎖正在被另乙個執行緒c佔據著,這是如果a先來b後來。那麼當c釋放鎖以後,a就會獲得這個鎖。如果是非公平的話,可能b後來但是能比a先獲得鎖。reen...

公平鎖與非公平鎖

公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,有先來後到。非公平鎖 是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖。在高併發的情況下,可能會造成優先順序反轉或者飢餓現象。lock lock newreentrantlock 當使用re...