(1)AQS的定位?
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),昌邑企業(yè)網(wǎng)站建設(shè),昌邑品牌網(wǎng)站建設(shè),網(wǎng)站定制,昌邑網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,昌邑網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。(2)AQS的重要組成部分?
(3)AQS運用的設(shè)計模式?
(4)AQS的總體流程?
AQS的全稱是AbstractQueuedSynchronizer,它的定位是為Java中幾乎所有的鎖和同步器提供一個基礎(chǔ)框架。
在之前的章節(jié)中,我們一起學(xué)習(xí)了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch的源碼,今天我們一起來對AQS做個總結(jié)。
AQS中定義了一個狀態(tài)變量state,它有以下兩種使用方法:
(1)互斥鎖
當(dāng)AQS只實現(xiàn)為互斥鎖的時候,每次只要原子更新state的值從0變?yōu)?成功了就獲取了鎖,可重入是通過不斷把state原子更新加1實現(xiàn)的。
(2)互斥鎖 + 共享鎖
當(dāng)AQS需要同時實現(xiàn)為互斥鎖+共享鎖的時候,低16位存儲互斥鎖的狀態(tài),高16位存儲共享鎖的狀態(tài),主要用于實現(xiàn)讀寫鎖。
互斥鎖是一種獨占鎖,每次只允許一個線程獨占,且當(dāng)一個線程獨占時,其它線程將無法再獲取互斥鎖及共享鎖,但是它自己可以獲取共享鎖。
共享鎖同時允許多個線程占有,只要有一個線程占有了共享鎖,所有線程(包括自己)都將無法再獲取互斥鎖,但是可以獲取共享鎖。
AQS中維護(hù)了一個隊列,獲取鎖失?。ǚ莟ryLock())的線程都將進(jìn)入這個隊列中排隊,等待鎖釋放后喚醒下一個排隊的線程(互斥鎖模式下)。
AQS中還有另一個非常重要的內(nèi)部類ConditionObject,它實現(xiàn)了Condition接口,主要用于實現(xiàn)條件鎖。
ConditionObject中也維護(hù)了一個隊列,這個隊列主要用于等待條件的成立,當(dāng)條件成立時,其它線程將signal這個隊列中的元素,將其移動到AQS的隊列中,等待占有鎖的線程釋放鎖后被喚醒。
Condition典型的運用場景是在BlockingQueue中的實現(xiàn),當(dāng)隊列為空時,獲取元素的線程阻塞在notEmpty條件上,一旦隊列中添加了一個元素,將通知notEmpty條件,將其隊列中的元素移動到AQS隊列中等待被喚醒。
AQS這個抽象類把模板方法設(shè)計模式運用地爐火純青,它里面定義了一系列的模板方法,比如下面這些:
// 獲取互斥鎖
public final void acquire(int arg) {
// tryAcquire(arg)需要子類實現(xiàn)
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
// 獲取互斥鎖可中斷
public final void acquireInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
// tryAcquire(arg)需要子類實現(xiàn)
if (!tryAcquire(arg))
doAcquireInterruptibly(arg);
}
// 獲取共享鎖
public final void acquireShared(int arg) {
// tryAcquireShared(arg)需要子類實現(xiàn)
if (tryAcquireShared(arg) < 0)
doAcquireShared(arg);
}
// 獲取共享鎖可中斷
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
// tryAcquireShared(arg)需要子類實現(xiàn)
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}
// 釋放互斥鎖
public final boolean release(int arg) {
// tryRelease(arg)需要子類實現(xiàn)
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
// 釋放共享鎖
public final boolean releaseShared(int arg) {
// tryReleaseShared(arg)需要子類實現(xiàn)
if (tryReleaseShared(arg)) {
doReleaseShared();
return true;
}
return false;
}
獲取鎖、釋放鎖的這些方法基本上都穿插在ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch的源碼解析中了,現(xiàn)在看他們是不是舒服多了,如果一開始就看這些源碼,難免會很暈。
上面一起學(xué)習(xí)了AQS中幾個重要的模板方法,下面我們再一起學(xué)習(xí)下幾個需要子類實現(xiàn)的方法:
// 互斥模式下使用:嘗試獲取鎖
protected boolean tryAcquire(int arg) {
throw new UnsupportedOperationException();
}
// 互斥模式下使用:嘗試釋放鎖
protected boolean tryRelease(int arg) {
throw new UnsupportedOperationException();
}
// 共享模式下使用:嘗試獲取鎖
protected int tryAcquireShared(int arg) {
throw new UnsupportedOperationException();
}
// 共享模式下使用:嘗試釋放鎖
protected boolean tryReleaseShared(int arg) {
throw new UnsupportedOperationException();
}
// 如果當(dāng)前線程獨占著鎖,返回true
protected boolean isHeldExclusively() {
throw new UnsupportedOperationException();
}
這幾個方法為什么不直接定義成抽象方法呢?
因為子類只要實現(xiàn)這幾個方法中的一部分就可以實現(xiàn)一個同步器了,所以不需要定義成抽象方法。
今天我們大概講了下AQS中幾個重要的組成部分,搞明白了這幾個結(jié)構(gòu),AQS對你將沒有任何秘密可言,當(dāng)然面試的時候能把這幾個點答清楚,面試官也會眼前一亮的。
(1)狀態(tài)變量state;
(2)AQS隊列;
(3)Condition隊列;
(4)模板方法;
(5)需要子類實現(xiàn)的方法;
經(jīng)過前面的學(xué)習(xí),您能簡要描述一下AQS獲取互斥鎖的大體流程嗎?
這里彤哥就不作答了,相信學(xué)習(xí)完前面的內(nèi)容,答這道題不是個問題了,答不上來的還需要把下面的推薦閱讀好好多看幾遍^^
1、 死磕 java同步系列之開篇
2、 死磕 java魔法類之Unsafe解析
3、 死磕 java同步系列之JMM(Java Memory Model)
4、 死磕 java同步系列之volatile解析
5、 死磕 java同步系列之synchronized解析
6、 死磕 java同步系列之自己動手寫一個鎖Lock
7、 死磕 java同步系列之AQS起篇
8、 死磕 java同步系列之ReentrantLock源碼解析(一)——公平鎖、非公平鎖
9、 死磕 java同步系列之ReentrantLock源碼解析(二)——條件鎖
10、 死磕 java同步系列之ReentrantLock VS synchronized
11、 死磕 java同步系列之ReentrantReadWriteLock源碼解析
12、 死磕 java同步系列之Semaphore源碼解析
13、 死磕 java同步系列之CountDownLatch源碼解析
歡迎關(guān)注我的公眾號“彤哥讀源碼”,查看更多源碼系列文章, 與彤哥一起暢游源碼的海洋。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
新聞名稱:死磕java同步系列之AQS終篇(面試)-創(chuàng)新互聯(lián)
文章路徑:http://www.rwnh.cn/article34/cepope.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站策劃、手機(jī)網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、響應(yīng)式網(wǎng)站、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容