ReentrantLock可重入鎖原理解析
ReentrantLock 可重入鎖
字面意思理解為同一線程可以重入加鎖
內(nèi)部主要邏輯繼承AQS來實現(xiàn)的,有兩種實現(xiàn)FairSycn、NonfairSync,公平鎖和非公平鎖,默認為非公平鎖。
- 公平鎖:保證先入隊的先獲得鎖。
- 非公平鎖:不保證先入隊的先獲得鎖,可能后面的線程先搶到鎖。
主要實現(xiàn)流程
CAS全名compare and swap比較交換,由native方法提供的系統(tǒng)原子性操作,以保證并發(fā)發(fā)安全性。
公平鎖的實現(xiàn)
加鎖
//加鎖 final void lock() { acquire(1);//調(diào)用AQS方法 }
//AQS方法 public final void acquire(int arg) { if (!tryAcquire(arg) &&//嘗試獲取鎖,抽象方法由子類實現(xiàn) acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) /* addWaiter 將線程加入等待隊列 * acquireQueued 嘗試獲取鎖、阻塞 */ { //中斷 selfInterrupt(); } }
//嘗試獲取鎖 protected final boolean tryAcquire(int acquires) { //獲取當前線程 final Thread current = Thread.currentThread(); int c = getState();//獲取state值,AQS屬性volatile標記 if (c == 0) {//鎖空閑狀態(tài) if (!hasQueuedPredecessors() &&//是否需要排隊 compareAndSetState(0, acquires)) {//獲取鎖 setExclusiveOwnerThread(current);//成功獲取,設(shè)置鎖owner為當前線程 return true;//后續(xù)不在處理 } } else if (current == getExclusiveOwnerThread()) {//當前線程已持有鎖,重入 int nextc = c + acquires;//state+1 if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc);//已持有鎖,直接設(shè)置state值 return true; } return false; }
解鎖
//解鎖,ReentrantLock方法 public void unlock() { sync.release(1);//AQS方法 }
//AQS解鎖 public final boolean release(int arg) { if (tryRelease(arg)) {//嘗試解鎖 Node h = head; if (h != null && h.waitStatus != 0)//waitStatus=0時不進行unpark(喚醒),next線程可能中斷 unparkSuccessor(h);//喚醒隊列中的線程去獲取鎖 return true; } return false; }
//嘗試解鎖ReentrantLock內(nèi)部靜態(tài)類Sync實現(xiàn) protected final boolean tryRelease(int releases) { int c = getState() - releases;//state-1 if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException();//非持有鎖的線程進行釋放,非法操作 boolean free = false; if (c == 0) {//持有鎖線程全部釋放 free = true; setExclusiveOwnerThread(null);//持有鎖線程置空 } setState(c);//持有鎖線程直接設(shè)置state return free; }
非公平鎖的實現(xiàn)
非公平鎖和公平鎖的核心區(qū)別是在嘗試獲取鎖方法tryAcquire實現(xiàn)中沒有判斷hasQueuedPredecessors()是否需要排隊,其他邏輯和公平鎖是一致的。
以上就是ReentrantLock可重入鎖原理解析的詳細內(nèi)容,更多關(guān)于ReentrantLock可重入鎖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java各種鎖在工作中使用場景和細節(jié)經(jīng)驗總結(jié)
本章主要說一說鎖在工作中的使用場景,主要以 synchronized 和 CountDownLatch 為例,會分別描述一下這兩種鎖的使用場景和姿勢2022-03-03SpringCloud全面解析@FeignClient標識接口的過程
這篇文章主要介紹了SpringCloud全面解析@FeignClient標識接口的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot配置文件properties和yml的實現(xiàn)
本文主要介紹了SpringBoot配置文件properties和yml的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04java文件操作工具類實現(xiàn)復(fù)制文件和文件合并
這篇文章主要介紹了java文件操作工具類,類實現(xiàn)了復(fù)制文件和文件合并的功能,需要的朋友可以參考下2014-03-03SpringCloud超詳細講解微服務(wù)網(wǎng)關(guān)Zuul
這篇文章主要介紹了SpringCloud Zuul微服務(wù)網(wǎng)關(guān),負載均衡,熔斷和限流,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實現(xiàn)詳解
在某些應(yīng)用場景中需要大量的二維數(shù)組來進行數(shù)據(jù)存儲,但是二維數(shù)組中卻有著大量的無用的位置占據(jù)著內(nèi)存空間,稀疏數(shù)組就是為了優(yōu)化二維數(shù)組,節(jié)省內(nèi)存空間2022-09-09