溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

掌握系列之并發(fā)編程-5.AQS和ReadWriteLock

發(fā)布時(shí)間:2020-08-06 12:14:04 來(lái)源:網(wǎng)絡(luò) 閱讀:149 作者:學(xué)習(xí)Lr 欄目:編程語(yǔ)言

掌握高并發(fā)、高可用架構(gòu)

第二課 并發(fā)編程

從本課開(kāi)始學(xué)習(xí)并發(fā)編程的內(nèi)容。主要介紹并發(fā)編程的基礎(chǔ)知識(shí)、鎖、內(nèi)存模型、線程池、各種并發(fā)容器的使用。

第五節(jié) AQS和ReadWriteLock

并發(fā)編程 線程通信 AQS ReadWriteLock Lock

AQS:AbstractQueuedSynchronizer

在同步組件的實(shí)現(xiàn)過(guò)程中,AQS是核心部分,通過(guò)使用AQS的模板方法來(lái)實(shí)現(xiàn)同步語(yǔ)義。AQS包含同步隊(duì)列的定義,以及對(duì)同步隊(duì)列進(jìn)行排隊(duì)、等待通知等來(lái)實(shí)現(xiàn)的獨(dú)占鎖的獲取和釋放;共享鎖的獲取和釋放;可中斷鎖超時(shí)等待鎖等特性。

同步隊(duì)列,即內(nèi)部類Node
volatile int waitState; // 節(jié)點(diǎn)狀態(tài)
volatile Node prev; // 當(dāng)前節(jié)點(diǎn)的上一節(jié)點(diǎn)
volatile Node next; // 當(dāng)前節(jié)點(diǎn)的下一節(jié)點(diǎn)
volatile Thread thread; // Node主體,線程
Node nextWaiter; // 等待隊(duì)列中的下一節(jié)點(diǎn)

其中,節(jié)點(diǎn)狀態(tài)的取值范圍為:

int CANCELLED = 1; // 節(jié)點(diǎn)從隊(duì)列中取消
int INITIAL = 0; // 初始狀態(tài)
int SIGNAL = -1; // 下一節(jié)點(diǎn)處于等待狀態(tài),當(dāng)當(dāng)前線程釋放鎖后會(huì)通知下一節(jié)點(diǎn),使其進(jìn)入執(zhí)行狀態(tài)
int CONDITION = -2; // 當(dāng)前節(jié)點(diǎn)進(jìn)入等待狀態(tài)
int PROPAGATE = -3; // 表示下一次共享狀態(tài)獲取將會(huì)無(wú)條件傳播下去

顯然,同步隊(duì)列是一個(gè)雙向鏈表。

另外,AQS中有兩個(gè)很重要的變量:同步隊(duì)列的頭尾節(jié)點(diǎn)。

private transient volatile Node head;
private transient volatile Node tail;

AQS通過(guò)頭尾指針來(lái)管理同步隊(duì)列,同時(shí)實(shí)現(xiàn)包括獲取鎖失敗的線程進(jìn)入隊(duì)列、釋放鎖時(shí)對(duì)同步隊(duì)列進(jìn)行通知等核心功能。

獨(dú)占鎖
void acquire(int arg); //獨(dú)占式獲取同步鎖,如果獲取失敗則插入同步隊(duì)列進(jìn)行等待
void acquireInterruptibly(int arg); //與acquire相同,但在同步隊(duì)列等待過(guò)程中可響應(yīng)中斷
boolean tryAcquireNanos(int arg, long nanos); //在acquireInterruptibly的基礎(chǔ)上增加了超時(shí)等待的功能,在超時(shí)時(shí)間內(nèi)沒(méi)有獲取到同步鎖則返回false
boolean release(int arg); //釋放鎖,該方法會(huì)喚醒同步隊(duì)列中的下一個(gè)節(jié)點(diǎn)
共享鎖
void acquireShared(int arg); //共享式獲取同步鎖,與獨(dú)占鎖的區(qū)別是同一時(shí)刻可以有多個(gè)線程獲取到同步狀態(tài)
void acquireSharedInterruptibly(int arg); //在acquireShared基礎(chǔ)上增加了響應(yīng)中斷的功能
boolean tryAcquireSharedNanos(int arg, long nanos); //在acquireSharedInterruptibly的基礎(chǔ)上增加了超時(shí)等待的功能
boolean releaseShared(int arg); //釋放共享式鎖
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI