基本概念
在波密等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站 網(wǎng)站設(shè)計制作按需開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷,外貿(mào)網(wǎng)站建設(shè),波密網(wǎng)站建設(shè)費用合理。本章,我們會講解“線程獲取公平鎖”的原理;在講解之前,需要了解幾個基本概念。后面的內(nèi)容,都是基于這些概念的;這些概念可能比較枯燥,但從這些概念中,能窺見“java鎖”的一些架構(gòu),這對我們了解鎖是有幫助的。
1. AQS -- 指AbstractQueuedSynchronizer類。
AQS是java中管理“鎖”的抽象類,鎖的許多公共方法都是在這個類中實現(xiàn)。AQS是獨占鎖(例如,ReentrantLock)和共享鎖(例如,Semaphore)的公共父類。
2. AQS鎖的類別 -- 分為“獨占鎖”和“共享鎖”兩種。
(01) 獨占鎖 -- 鎖在一個時間點只能被一個線程鎖占有。根據(jù)鎖的獲取機制,它又劃分為“公平鎖”和“非公平鎖”。公平鎖,是按照通過CLH等待線程按照先來先得的規(guī)則,公平的獲取鎖;而非公平鎖,則當(dāng)線程要獲取鎖時,它會無視CLH等待隊列而直接獲取鎖。獨占鎖的典型實例子是ReentrantLock,此外,ReentrantReadWriteLock.WriteLock也是獨占鎖。
(02) 共享鎖 -- 能被多個線程同時擁有,能被共享的鎖。JUC包中的ReentrantReadWriteLock.ReadLock,CyclicBarrier, CountDownLatch和Semaphore都是共享鎖。這些鎖的用途和原理,在以后的章節(jié)再詳細(xì)介紹。
3. CLH隊列 -- Craig, Landin, and Hagersten lock queue
CLH隊列是AQS中“等待鎖”的線程隊列。在多線程中,為了保護(hù)競爭資源不被多個線程同時操作而起來錯誤,我們常常需要通過鎖來保護(hù)這些資源。在獨占鎖中,競爭資源在一個時間點只能被一個線程鎖訪問;而其它線程則需要等待。CLH就是管理這些“等待鎖”的線程的隊列。
CLH是一個非阻塞的 FIFO 隊列。也就是說往里面插入或移除一個節(jié)點的時候,在并發(fā)條件下不會阻塞,而是通過自旋鎖和 CAS 保證節(jié)點插入和移除的原子性。
4. CAS函數(shù) -- Compare And Swap
CAS函數(shù),是比較并交換函數(shù),它是原子操作函數(shù);即,通過CAS操作的數(shù)據(jù)都是以原子方式進(jìn)行的。例如,compareAndSetHead(), compareAndSetTail(), compareAndSetNext()等函數(shù)。它們共同的特點是,這些函數(shù)所執(zhí)行的動作是以原子的方式進(jìn)行的。
本章是圍繞“公平鎖”如何獲取鎖而層次展開?!肮芥i”涉及到的知識點比較多,但總的來說,不是特別難;如果讀者能讀懂AQS和ReentrantLock.java這兩個類的大致意思,理解鎖的原理和機制也就不成問題了。本章只是作者本人對鎖的一點點理解,希望這部分知識能幫助您了解“公平鎖”的獲取過程,認(rèn)識“鎖”的框架。
ReentrantLock數(shù)據(jù)結(jié)構(gòu)
ReentrantLock的UML類圖
從圖中可以看出:
(01) ReentrantLock實現(xiàn)了Lock接口。
(02) ReentrantLock與sync是組合關(guān)系。ReentrantLock中,包含了Sync對象;而且,Sync是AQS的子類;更重要的是,Sync有兩個子類FairSync(公平鎖)和NonFairSync(非公平鎖)。ReentrantLock是一個獨占鎖,至于它到底是公平鎖還是非公平鎖,就取決于sync對象是"FairSync的實例"還是"NonFairSync的實例"。
獲取公平鎖(基于JDK1.7.0_40)
通過前面“Java多線程系列--“JUC鎖”02之 互斥鎖ReentrantLock”的“示例1”,我們知道,獲取鎖是通過lock()函數(shù)。下面,我們以lock()對獲取公平鎖的過程進(jìn)行展開。
1. lock()
lock()在ReentrantLock.java的FairSync類中實現(xiàn),它的源碼如下:
final void lock() { acquire(1); }