公平鎖與非公平鎖

2021-08-18 18:55:04 字數 1183 閱讀 1565

公平鎖與非公平鎖即fairsybc和nonfairsync。

簡單說一下兩個鎖的區別:

顧名思義,公平就是先到先得,比如a和b執行緒均需要獲得乙個鎖,但是此時鎖正在被另乙個執行緒c佔據著,這是如果a先來b後來。那麼當c釋放鎖以後,a就會獲得這個鎖。

如果是非公平的話,可能b後來但是能比a先獲得鎖。

reentrantlock可以設定鎖的屬性為公平還是非公平

public reentrantlock(boolean fair)
public reentrantlock()

預設無參構造建立的是非公平鎖,這樣做的好處就是能夠提高效能。至於為什麼非公平鎖能提高效能,我們等下分析原始碼解釋。

直接上兩種鎖 獲取鎖的原始碼

先公平鎖

static final class fairsync extends sync 

}else if (current == getexclusiveownerthread())

return false;

}}

c表示當前執行緒的狀態。

public final boolean hasqueuedpredecessors()
公平鎖獲取鎖的條件是是否有等待佇列,有的話就嘗試獲取鎖。

非公平鎖

final boolean nonfairtryacquire(int acquires) 

}else if (current == getexclusiveownerthread())

return false;

}

release釋放鎖

protected final boolean tryrelease(int releases) 

setstate(c);

return free;

}

lock()

public void lock()
執行緒每次呼叫lock方法,如果成功獲取的話,state值就會加1。

當乙個執行緒獲取到了鎖之後state值在每次一獲取和釋放鎖之後會更新,只有當state值為0時,別的執行緒才有可能獲取到這個鎖,進而執行自己執行緒的任務。

公平鎖與非公平鎖

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

公平鎖與非公平鎖

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

公平鎖與非公平鎖

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