一、經典故事
村子裡面,有一口井水。水質很好,村民們都想打井裡的水。
村長這時就制定了規則:
井邊安排乙個看井人,維護打水的秩序。
打水時,以家庭為單位,哪個家庭任何人先到井邊,就可以先打水,而且如果乙個家庭佔到了打水權,其家人這時候過來打水不用排隊。
而那些沒有搶占到打水權的人,乙個乙個挨著在井邊排成一隊,先到的排在前面。
二、圖析reentrantlock
/**由建構函式中可知,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)
非公平鎖減少執行緒掛起的機率,後來的執行緒有一定的機率直接獲取鎖。
1. 非公平模式:
2. 公平鎖模式:
至於:
publicfinal
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 不可重入鎖的實...