AQS之可重入鎖ReentrantLock原理

2022-01-24 06:33:28 字數 2239 閱讀 5237

一、經典故事

村子裡面,有一口井水。水質很好,村民們都想打井裡的水。

村長這時就制定了規則:

井邊安排乙個看井人,維護打水的秩序。

打水時,以家庭為單位,哪個家庭任何人先到井邊,就可以先打水,而且如果乙個家庭佔到了打水權,其家人這時候過來打水不用排隊。

而那些沒有搶占到打水權的人,乙個乙個挨著在井邊排成一隊,先到的排在前面。

二、圖析reentrantlock

/**

* creates an instance of .

* this is equivalent to using .

*/public

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)

由建構函式中可知,reentrantlock預設採用的是非公平鎖模式,之所以預設才用這種模式,是因為:

非公平鎖減少執行緒掛起的機率,後來的執行緒有一定的機率直接獲取鎖。

1. 非公平模式:

2. 公平鎖模式:

至於:

public

final

void acquire(int

arg)

acquirequeued(addwaiter(node.exclusive), arg):入隊

selfinterrupt():阻塞
三、比對打水的故事問看井人:空閒情況下,所有家庭問的結果,只能有乙個成功。(cas)

可重入鎖:家庭為單位(每乙個人同屬乙個執行緒),家庭獲取到了打水權,家庭裡所有人都獲取到了打水權。

非公平模式:新到的家庭代表,直接去問看井人井是否空閒了

1. 空閒了就獲取打水權

2. 不空閒,再看一眼有沒有人在打水?

2.1 沒人,再去問看井人

2.2 有人,是不是自家人?是則去打水,否則去排隊

公平鎖模式:新到的人(比如叫張三),先肉眼看是否有人在打水?

1.   沒人的話再看前面有沒有人排隊

1.1 有人排隊,乖乖的去排隊

1.2 沒人排隊,去問看井人決定是否成功獲取打水權

2.   有人在打水,問問打水人跟張三是否一家的?

2.1 是,可以來打水

2.2 否,去排隊

可重入鎖 不可重入鎖

可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...

鎖 可重入鎖

reetrantlick相對於 synchronized 的優勢 reentrantlock獨有的能力 1.reentrantlock可以指定是公平鎖還是非公平鎖。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的執行緒先獲得鎖。2.reentrantlock提供了乙個conditi...

可重入鎖和不可重入鎖

當乙個執行緒獲得當前例項的鎖lock,並且進入了方法a,該執行緒在方法a沒有釋放該鎖的時候,是否可以再次進入使用該鎖的方法b?不可重入鎖 在方法a釋放鎖之前,不可以再次進入方法b 可重入鎖 在方法a釋放該鎖之前可以再次進入方法b 如reentrantlock和synchronized 不可重入鎖的實...