ReentrantLock與AQS

AQS是J.U.C的基礎,J.U.C中的很多并發(fā)工具,例如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS來實現(xiàn)。

AQS中維護了一個volatile的整型變量state,和一個FIFO的同步隊列(使用雙向鏈表實現(xiàn))。線程通過對state進行CAS操作來獲取鎖,獲取鎖失敗后會被加入到同步隊列中,調用park進行掛起,等待鎖被釋放后被其他線程喚醒。


AQS

雙向隊列中的元素為Node,Node的結構定義如下:

static final class Node {

static final int CANCELLED =1; //表示線程獲取鎖的請求已經(jīng)取消了

static final int SIGNAL = -1; //表示線程已經(jīng)準備好了,就等資源釋放了

static final int CONDITION = -2;//表示節(jié)點在等待隊列中,節(jié)點線程等待喚醒

static final int PROPAGATE = -3; //當前線程處在SHARED情況下,該字段才會使用

volatile int waitStatus;? //當前節(jié)點在隊列中的狀態(tài),上面的幾個常量int值為waitStatus的幾個狀態(tài)

volatile Node prev; //前驅指針

volatile Node next;//后繼指針

volatile Thread thread; //表示處于該節(jié)點的線程

Node nextWaiter;//指向下一個處于CONDITION狀態(tài)的節(jié)點

}

非公平鎖加鎖過程:

ReentrantLock.lock()? ->? NonfairSync.lock() :

1、 對state變量進行cas操作爭搶鎖,cas成功,setExclusiveOwnerThread為當前線程,取鎖成功

2、cas失敗,執(zhí)行AQS的acquire方法

① nonfairSync.tryAcquire():如果state等于0,再次進行cas操作,成功則獲取鎖,返回true;如果state不等于0,檢查當前線程是否為線程,如果為本線程,state自增,返回true;否則返回false;?

② 若①返回false,則調用addWaiter方法將本線程封裝為Node節(jié)點進行入隊操作:若隊列沒有元素,則新建一個虛節(jié)點作為Head節(jié)點,使用CAS將當前線程加入到隊列的隊尾。調用acquireQueue判斷當前傳入的Node對應的前置節(jié)點是否為head,如果是則嘗試加鎖。加鎖成功過則將當前節(jié)點設置為head節(jié)點,然后空置之前的head節(jié)點,方便后續(xù)被垃圾回收掉。如果加鎖失敗或者Node的前置節(jié)點不是head節(jié)點,就會通過shouldParkAfterFailedAcquire方法將head節(jié)點的waitStatus變?yōu)榱薙IGNAL=-1,最后執(zhí)行parkAndChecknIterrupt方法,調用LockSupport.park()掛起當前線程


非公平鎖解鎖過程:

ReentrantLock.unLock()? ->? AQS.release() :

1、調用nonfairSync的tryRelease()方法,將state進行自減,如果state==0,則setExclusiveOwnerThread為null,釋放鎖,return true;若state不為0,則return false;

2、若tryRelease返回true,則繼續(xù)判斷head節(jié)點的waitStatus是否為0,前面我們已經(jīng)看到過,head的waitStatue為SIGNAL(-1),這里就會執(zhí)行unparkSuccessor():將head節(jié)點的waitStatus設置為0,重新將head指針指向next節(jié)點,且使用LockSupport.unpark next節(jié)點。被喚醒的線程會接著嘗試獲取鎖,用CAS指令修改state數(shù)據(jù),接著之前被park的地方繼續(xù)執(zhí)行,繼續(xù)執(zhí)行acquireQueued()方法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容