Javaconcurrency之公平鎖(一)_動力節(jié)點Java學(xué)院整理-創(chuàng)新互聯(lián)

基本概念

在波密等地區(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中“等待鎖”的線程隊列。在多線程中,為了保護競爭資源不被多個線程同時操作而起來錯誤,我們常常需要通過鎖來保護這些資源。在獨占鎖中,競爭資源在一個時間點只能被一個線程鎖訪問;而其它線程則需要等待。CLH就是管理這些“等待鎖”的線程的隊列。
    CLH是一個非阻塞的 FIFO 隊列。也就是說往里面插入或移除一個節(jié)點的時候,在并發(fā)條件下不會阻塞,而是通過自旋鎖和 CAS 保證節(jié)點插入和移除的原子性。

4. CAS函數(shù) -- Compare And Swap
    CAS函數(shù),是比較并交換函數(shù),它是原子操作函數(shù);即,通過CAS操作的數(shù)據(jù)都是以原子方式進行的。例如,compareAndSetHead(), compareAndSetTail(), compareAndSetNext()等函數(shù)。它們共同的特點是,這些函數(shù)所執(zhí)行的動作是以原子的方式進行的。

本章是圍繞“公平鎖”如何獲取鎖而層次展開。“公平鎖”涉及到的知識點比較多,但總的來說,不是特別難;如果讀者能讀懂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()對獲取公平鎖的過程進行展開。

1. lock()

lock()在ReentrantLock.java的FairSync類中實現(xiàn),它的源碼如下:

final void lock() {
 acquire(1);
}

文章標(biāo)題:Javaconcurrency之公平鎖(一)_動力節(jié)點Java學(xué)院整理-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://muchs.cn/article36/dphjpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、用戶體驗網(wǎng)站改版、移動網(wǎng)站建設(shè)、微信小程序云服務(wù)器

廣告

聲明:本網(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)

手機網(wǎng)站建設(shè)