java並發包中的公平鎖與非公平鎖有啥區別

2021-09-19 12:25:49 字數 1010 閱讀 5306

注意一點,此時執行緒2可還停留在等待佇列裡啊,還沒開始嘗試重新加鎖呢!

然而,不幸的事情發生了,這時半路殺出個程咬金,來了乙個執行緒3!執行緒3突然嘗試對reentrantlock發起加鎖操作,此時會發生什麼事情?

很簡單!執行緒2還沒來得及重新嘗試加鎖呢。也就是說,還沒來得及嘗試重新執行cas操作將state的值從0變為1呢!執行緒3衝上來直接乙個cas操作,嘗試將state的值從0變為1,結果還成功了!

一旦cas操作成功,執行緒3就會將「加鎖執行緒」這個變數設定為他自己。給大家來一張圖,看看這整個過程:

這就導致執行緒2被喚醒過後,重新嘗試加鎖執行cas操作,結果毫無疑問,失敗!

咱們重新回到第一張圖,就是執行緒1剛剛釋放鎖之後,執行緒2還沒來得及重新加鎖的那個狀態。

同樣,這時假設來了乙個執行緒3,突然殺出來,想要加鎖。

上面的等待佇列中,執行緒3會按照公平原則直接進入佇列尾部進行排隊。

接著,執行緒2不是被喚醒了麼?他就會重新嘗試進行cas加鎖,此時沒人跟他搶,他當然可以加鎖成功了。

然後呢,執行緒2就會將state值變為1,同時設定「加鎖執行緒」是自己。最後,執行緒2自己從等待佇列裡出隊。

整個過程,參見下圖:

這個就是公平鎖的策略,過來加鎖的執行緒全部是按照先來後到的順序,依次進入等待佇列中排隊的,不會盲目的胡亂搶占加鎖,非常的公平。

公平鎖與非公平鎖

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

公平鎖與非公平鎖

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

公平鎖與非公平鎖

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