今天來分析一下重入鎖的原始碼
重入鎖reentranlock是一種支援重進入的鎖,表示該鎖可以支援乙個執行緒對資源重複加鎖,並且分為公平鎖和非公平鎖
synchronized大家一定都很熟悉了,這也是一種隱式的重入鎖,是一種非公平鎖
當執行緒再次獲取鎖時,鎖需要先判斷該執行緒是否為當前佔據鎖的執行緒,如果是則再次成功獲取
當釋放鎖時,如果執行緒重複n次獲取了鎖,必須要在第n次釋放該鎖後,其他執行緒才能夠獲取到該鎖
非公平鎖的獲取
當再次獲取同步狀態時,通過判斷當前執行緒是否為鎖的持有者來決定獲取操作是否成功,成功則將同步狀態值增加並返回true
final
boolean nonfairtryacquire(int acquires)
}// 如果當前執行緒是鎖的持有者,則將同步數量增加
else
if (current == getexclusiveownerthread())
return
false;
}
公平鎖的獲取
與非公平鎖的獲取區別為,需要在cas操作的同時判斷是否還有前驅結點,當沒有前驅結點時才為下一次需要執行的執行緒
protected
final
boolean
tryacquire(int acquires)
}else
if (current == getexclusiveownerthread())
return
false;
}
鎖的釋放
如果該鎖被獲取了n次,那麼前n-1次tryrelease方法一定返回false,只有同步狀態完全釋放了才返回true,並且將鎖的佔有者設為空。
protected
final
boolean
tryrelease(int releases)
// 數量不為0時,將數量寫回同步狀態值
setstate(c);
return free;
}
公平鎖比非公平鎖的的效率低,因為需要切換更多次,吞吐量降低
公平鎖能夠減少飢餓發生的概率,因為非公平鎖會使剛釋放鎖的執行緒再次獲取同步狀態的機率非常大,使得其他執行緒只能在aqs(同步佇列)中等待
也許我們很渺小,但我們都要仰望星空的權利
可重入鎖 不可重入鎖
可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...
可重入鎖和不可重入鎖
當乙個執行緒獲得當前例項的鎖lock,並且進入了方法a,該執行緒在方法a沒有釋放該鎖的時候,是否可以再次進入使用該鎖的方法b?不可重入鎖 在方法a釋放鎖之前,不可以再次進入方法b 可重入鎖 在方法a釋放該鎖之前可以再次進入方法b 如reentrantlock和synchronized 不可重入鎖的實...
可重入鎖和不可重入鎖
可重入鎖就是可以迴圈迭代使用的鎖,不會產生死鎖的現象,典型的就是synchronized和reentrantlock。不可重入鎖迴圈迭代使用則有產生死鎖的風險。可重入鎖 class reentranttest implements runnable public synchronized void ...