基本概念
本章,我們會(huì)講解“線程獲取公平鎖”的原理;在講解之前,需要了解幾個(gè)基本概念。后面的內(nèi)容,都是基于這些概念的;這些概念可能比較枯燥,但從這些概念中,能窺見“java鎖”的一些架構(gòu),這對(duì)我們了解鎖是有幫助的。
1. AQS -- 指AbstractQueuedSynchronizer類。
AQS是java中管理“鎖”的抽象類,鎖的許多公共方法都是在這個(gè)類中實(shí)現(xiàn)。AQS是獨(dú)占鎖(例如,ReentrantLock)和共享鎖(例如,Semaphore)的公共父類。
2. AQS鎖的類別 -- 分為“獨(dú)占鎖”和“共享鎖”兩種。
(01) 獨(dú)占鎖 -- 鎖在一個(gè)時(shí)間點(diǎn)只能被一個(gè)線程鎖占有。根據(jù)鎖的獲取機(jī)制,它又劃分為“公平鎖”和“非公平鎖”。公平鎖,是按照通過CLH等待線程按照先來先得的規(guī)則,公平的獲取鎖;而非公平鎖,則當(dāng)線程要獲取鎖時(shí),它會(huì)無視CLH等待隊(duì)列而直接獲取鎖。獨(dú)占鎖的典型實(shí)例子是ReentrantLock,此外,ReentrantReadWriteLock.WriteLock也是獨(dú)占鎖。
(02) 共享鎖 -- 能被多個(gè)線程同時(shí)擁有,能被共享的鎖。JUC包中的ReentrantReadWriteLock.ReadLock,CyclicBarrier, CountDownLatch和Semaphore都是共享鎖。這些鎖的用途和原理,在以后的章節(jié)再詳細(xì)介紹。
3. CLH隊(duì)列 -- Craig, Landin, and Hagersten lock queue
CLH隊(duì)列是AQS中“等待鎖”的線程隊(duì)列。在多線程中,為了保護(hù)競(jìng)爭(zhēng)資源不被多個(gè)線程同時(shí)操作而起來錯(cuò)誤,我們常常需要通過鎖來保護(hù)這些資源。在獨(dú)占鎖中,競(jìng)爭(zhēng)資源在一個(gè)時(shí)間點(diǎn)只能被一個(gè)線程鎖訪問;而其它線程則需要等待。CLH就是管理這些“等待鎖”的線程的隊(duì)列。
CLH是一個(gè)非阻塞的 FIFO 隊(duì)列。也就是說往里面插入或移除一個(gè)節(jié)點(diǎn)的時(shí)候,在并發(fā)條件下不會(huì)阻塞,而是通過自旋鎖和 CAS 保證節(jié)點(diǎn)插入和移除的原子性。
4. CAS函數(shù) -- Compare And Swap
CAS函數(shù),是比較并交換函數(shù),它是原子操作函數(shù);即,通過CAS操作的數(shù)據(jù)都是以原子方式進(jìn)行的。例如,compareAndSetHead(), compareAndSetTail(), compareAndSetNext()等函數(shù)。它們共同的特點(diǎn)是,這些函數(shù)所執(zhí)行的動(dòng)作是以原子的方式進(jìn)行的。
本章是圍繞“公平鎖”如何獲取鎖而層次展開?!肮芥i”涉及到的知識(shí)點(diǎn)比較多,但總的來說,不是特別難;如果讀者能讀懂AQS和ReentrantLock.java這兩個(gè)類的大致意思,理解鎖的原理和機(jī)制也就不成問題了。本章只是作者本人對(duì)鎖的一點(diǎn)點(diǎn)理解,希望這部分知識(shí)能幫助您了解“公平鎖”的獲取過程,認(rèn)識(shí)“鎖”的框架。
ReentrantLock數(shù)據(jù)結(jié)構(gòu)
ReentrantLock的UML類圖
從圖中可以看出:
(01) ReentrantLock實(shí)現(xiàn)了Lock接口。
(02) ReentrantLock與sync是組合關(guān)系。ReentrantLock中,包含了Sync對(duì)象;而且,Sync是AQS的子類;更重要的是,Sync有兩個(gè)子類FairSync(公平鎖)和NonFairSync(非公平鎖)。ReentrantLock是一個(gè)獨(dú)占鎖,至于它到底是公平鎖還是非公平鎖,就取決于sync對(duì)象是"FairSync的實(shí)例"還是"NonFairSync的實(shí)例"。
獲取公平鎖(基于JDK1.7.0_40)
通過前面“Java多線程系列--“JUC鎖”02之 互斥鎖ReentrantLock”的“示例1”,我們知道,獲取鎖是通過lock()函數(shù)。下面,我們以lock()對(duì)獲取公平鎖的過程進(jìn)行展開。
1. lock()
lock()在ReentrantLock.java的FairSync類中實(shí)現(xiàn),它的源碼如下:
final void lock() { acquire(1); }
文章標(biāo)題:Javaconcurrency之公平鎖(一)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://jinyejixie.com/article36/dphjpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、用戶體驗(yàn)、網(wǎng)站改版、移動(dòng)網(wǎng)站建設(shè)、微信小程序、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容