公平鎖與非公平鎖# 公平鎖與非公平鎖
公平鎖:
多個執行緒按照申請鎖的順序來獲取鎖,先來後到,在併發環境中,每個執行緒在獲取鎖時會先檢視此鎖維護的等待佇列,如果為空,或者當前執行緒等待佇列的第乙個,就占有鎖,否則就會加入到等待佇列,以後會按照fifo的規則從佇列中取。
非公平鎖:
多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒獲取鎖。在高併發的情況下,喲可能會造成優先順序反轉或者飢餓現象。
reentrantlock類 :預設是非公平鎖,在建構函式中加引數true,會建立公平鎖。
非公平鎖的優點:非公平鎖的吞吐量大
reentrantlock的構造器,預設時new 乙個非公平的鎖。
非公平鎖有哪幾種:reentrantlock,synchronized
可重入鎖,也叫遞迴鎖
可重入鎖:指的是同乙個執行緒外層函式獲得鎖之後,內層遞迴函式仍然能獲取該鎖的**,在同乙個執行緒在外層方法獲取鎖的時候,進入內層方法會自動獲取鎖
種類:reentrantlock 和 synchronized 都是可重入鎖
作用:避免死鎖
注意點:用了鎖,一定要記得開鎖和關鎖,lock和unlock方法都是一對一對的出現,避免出現錯誤,如果少了其中的乙個,就會報錯。
reentrantlock 版本:
publicclass
mylock_1 ).start();
}static reentrantlock reentrantlock = new
reentrantlock();
public
static
void
mylock()
finally
}catch
(exception ex)
finally}}
結果:
synchronized 版本:其實一層裡面再套一層,多層,但是獲取到的物件都是第一把鎖,鎖住的物件。
public結果:class xttblog
public
synchronized
void
dosomething()
private
synchronized
void
doanotherthing() }
class
superxttblog
}
可重入鎖的原理: 詳情到時看 reentrantlock 原始碼
重入鎖實現可重入性原理或機制是:每乙個鎖關聯乙個執行緒持有者和計數器,當計數器為 0 時表示該鎖沒有被任何執行緒持有,那麼任何執行緒都可能獲得該鎖而呼叫相應的方法;
當某一線程請求成功後,jvm會記下鎖的持有執行緒,並且將計數器置為 1;此時其它執行緒請求該鎖,則必須等待;而該持有鎖的執行緒如果再次請求這個鎖,就可以再次拿到這個鎖,
同時計數器會遞增;當執行緒退出同步**塊時,計數器會遞減,如果計數器為 0,則釋放該鎖。
公平鎖與非公平鎖
在reentrantlock中很明顯可以看到其中同步包括兩種,分別是公平的fairsync和非公平的nonfairsync。公平鎖的作用就是嚴格按照執行緒啟動的順序來執行的,不允許其他執行緒插隊執行的 而非公平鎖是允許插隊的。預設情況下reentrantlock是通過非公平鎖來進行同步的,包括syn...
公平鎖與非公平鎖
公平鎖與非公平鎖即fairsybc和nonfairsync。簡單說一下兩個鎖的區別 顧名思義,公平就是先到先得,比如a和b執行緒均需要獲得乙個鎖,但是此時鎖正在被另乙個執行緒c佔據著,這是如果a先來b後來。那麼當c釋放鎖以後,a就會獲得這個鎖。如果是非公平的話,可能b後來但是能比a先獲得鎖。reen...
公平鎖與非公平鎖
公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,有先來後到。非公平鎖 是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖。在高併發的情況下,可能會造成優先順序反轉或者飢餓現象。lock lock newreentrantlock 當使用re...