公平鎖與非公平鎖

2021-09-29 09:27:05 字數 1162 閱讀 4958

公平鎖:是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,有先來後到。

非公平鎖:是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖。在高併發的情況下,可能會造成優先順序反轉或者飢餓現象。

lock lock =

newreentrantlock()

;

當使用reentrantlock的空參構造方法時,預設為非公平鎖,原始碼如下:

/**

* creates an instance of .

* this is equivalent to using .

*/public

reentrantlock()

那麼,如何控制該鎖為公平鎖呢?檢視原始碼可以發現reentrantlock的有參構造方法,如下圖所示。

/**

* creates an instance of with the

* given fairness policy.

** @param fair if this lock should use a fair ordering policy

*/public

reentrantlock

(boolean fair)

當boolean型別的fair值為true時,此時建立的鎖就是公平鎖,**如下:

// 引數為true時,為公平鎖;

// 引數為false時,或者使用空參構造時,為不公平鎖;

lock lock =

newreentrantlock

(true

);

兩者區別

公平鎖:在併發環境中,每個執行緒在獲取鎖時會先檢視此鎖維護的等待佇列,如果為空,或者是當前執行緒是等待佇列的第乙個,就占有鎖,否則就加入到等待佇列中,按照fifo的規則處理請求。

非公平鎖:直接嘗試占有鎖資源,如果嘗試失敗,就採用類似公平鎖的方式。較公平鎖而言,非公平鎖的吞吐量大。

ps:synchronized也是一種非公平鎖。

公平鎖與非公平鎖

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

公平鎖與非公平鎖

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

公平鎖與非公平鎖

看到公平和非公平兩個詞,我們就可以簡單的理解到公平與非公平的含義,公平的意思呢,就是按照排隊順序逐個來進行執行,非公平的含義呢,就是誰更霸道,就更能搶占到執行的優先。所以我們的公平鎖,就是多個執行緒按照執行緒的申請順序,逐個獲得鎖,然後排隊執行。優點 所有的執行緒都能得到資源。缺點 吞吐量會下降很多...