成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

基本概念

在波密等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷,外貿(mào)網(wǎng)站建設(shè),波密網(wǎng)站建設(shè)費(fèi)用合理。

本章,我們會(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)

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