公平鎖與非公平鎖

2022-02-04 14:30:48 字數 1917 閱讀 6528

公平鎖與非公平鎖
# 公平鎖與非公平鎖

公平鎖:

多個執行緒按照申請鎖的順序來獲取鎖,先來後到,在併發環境中,每個執行緒在獲取鎖時會先檢視此鎖維護的等待佇列,如果為空,或者當前執行緒等待佇列的第乙個,就占有鎖,否則就會加入到等待佇列,以後會按照fifo的規則從佇列中取。

非公平鎖:

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

reentrantlock類 :預設是非公平鎖,在建構函式中加引數true,會建立公平鎖。

非公平鎖的優點:非公平鎖的吞吐量大

reentrantlock的構造器,預設時new 乙個非公平的鎖。

非公平鎖有哪幾種:reentrantlock,synchronized

可重入鎖,也叫遞迴鎖

可重入鎖:指的是同乙個執行緒外層函式獲得鎖之後,內層遞迴函式仍然能獲取該鎖的**,在同乙個執行緒在外層方法獲取鎖的時候,進入內層方法會自動獲取鎖  

種類:reentrantlock 和 synchronized 都是可重入鎖 

作用:避免死鎖 

注意點:用了鎖,一定要記得開鎖和關鎖,lock和unlock方法都是一對一對的出現,避免出現錯誤,如果少了其中的乙個,就會報錯。

reentrantlock  版本:

public

class

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...