如何淺析Java并發(fā)工具類在AQS實現(xiàn)

本篇文章給大家分享的是有關(guān)如何淺析Java并發(fā)工具類在AQS實現(xiàn),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)防城免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

眾所周知,AQS是一個Java提高的底層同步工具類。本文就AQS的資源共享方式,state的作用,自定義同步器的方法,CountDownLatch,Semaphore,Semaphore和RateLimiter的區(qū)別,CyclicBarrier幾方面來為大家淺析Java并發(fā)工具類。 

AQS維護了一個volatile int state(代表共享資源)和一個FIFO線程等待隊列(多線程爭用資源被阻塞時會進入此隊列),用于后續(xù)的調(diào)度。此外還可能有一個或者多個的Condition單向鏈表,用于Condition的處理,這個單向鏈表不是必須的,可能不存在。

1、AQS的資源共享方式

Exclusive(獨占,只有一個線程能執(zhí)行,如ReentrantLock)

Share(共享,多個線程可同時執(zhí)行,如Semaphore/CountDownLatch)

2、state的作用

以ReentrantLock為例,state初始化為0,表示未鎖定狀態(tài)。A線程lock()時,會調(diào)用tryAcquire()獨占該鎖并將state+1。此后,其他線程再tryAcquire()時就會失敗,直到A線程unlock()到state=0(即釋放鎖)為止,其它線程才有機會獲取該鎖。當(dāng)然,釋放鎖之前,A線程自己是可以重復(fù)獲取此鎖的(state會累加),這就是可重入的概念。但要注意,獲取多少次就要釋放多少次,這樣才能保證state能回到零狀態(tài)。

以CountDownLatch以例,任務(wù)分為N個子線程去執(zhí)行,state也初始化為N(注意N要與線程個數(shù)一致)。這N個子線程是并行執(zhí)行的,每個子線程執(zhí)行完后countDown()一次,state會CAS減1。等到所有子線程都執(zhí)行完后(即state=0),會unpark()調(diào)用主線程,然后調(diào)用主線程就會從await()函數(shù)返回,繼續(xù)后續(xù)動作。

3、自定義同步器的方法

具體線程等待隊列的維護(如獲取資源失敗入隊/喚醒出隊等),AQS已經(jīng)在頂層實現(xiàn)好了。自定義同步器實現(xiàn)時主要實現(xiàn)以下幾種方法:

isHeldExclusively():該線程是否正在獨占資源。只有用到condition才需要去實現(xiàn)它。

tryAcquire(int):獨占方式。嘗試獲取資源,成功則返回true,失敗則返回false。

tryRelease(int):獨占方式。嘗試釋放資源,成功則返回true,失敗則返回false。

tryAcquireShared(int):共享方式。嘗試獲取資源。負數(shù)表示失??;0表示成功,但沒有剩余可用資源;正數(shù)表示成功,且有剩余資源。

tryReleaseShared(int):共享方式。嘗試釋放資源,如果釋放后允許喚醒后續(xù)等待結(jié)點返回true,否則返回false。

4、CountDownLatch

CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值為線程的數(shù)量。每當(dāng)一個線程完成了自己的任務(wù)后,計數(shù)器的值就會減1。當(dāng)計數(shù)器值到達0時,它表示所有的線程已經(jīng)完成了任務(wù),然后等待的線程就可以恢復(fù)執(zhí)行任務(wù)。

常見運用場景

多線程做資源初始化,主線程先暫停等待初始化結(jié)束;每個線程初始化結(jié)束后都countDown一次,等全部線程都初始化結(jié)束后(state=0),此時主線程再繼續(xù)往下執(zhí)行

5、Semaphore

Semaphore可以控制某個資源可被同時訪問的個數(shù),通過acquire()獲取一個許可,如果沒有就等待,而release() 釋放一個許可。單個信號量的Semaphore對象可以實現(xiàn)互斥鎖的功能,并且可以是由一個線程獲得了“鎖”,再由另一個線程釋放“鎖”,這可應(yīng)用于死鎖恢復(fù)的一些場合。

常見應(yīng)用場景

Semaphore可以用來做流量控制,限制可以訪問某些資源(物理或邏輯的),特別公用資源有限的應(yīng)用場景,比如數(shù)據(jù)庫連接。

6、Semaphore和RateLimiter的區(qū)別

Semaphore:作用是限定只有搶到信號的線程才能執(zhí)行,其他的都得等待。你可以設(shè)置N個信號,這樣最多可以有N個線程同時執(zhí)行。注意,其他的線程只是掛起了,是通過限制線程個數(shù)來進行限流。

RateLimiter:Guava的限流工具類,基于令牌桶算法實現(xiàn)。作用是 限制一秒內(nèi)只能有N個線程執(zhí)行,超過了就只能等待下一秒。注意,N是double類型。是從速率來進行限流。

7、CyclicBarrier

CyclicBarrier可以使一定數(shù)量的線程反復(fù)地在柵欄位置處匯集。當(dāng)線程到達柵欄位置時將調(diào)用await方法,這個方法將阻塞直到所有線程都到達柵欄位置。如果所有線程都到達柵欄位置,那么柵欄將打開,此時所有的線程都將被釋放,而柵欄將會重置為原來的計數(shù)以便下次使用。

常見應(yīng)用場景

用于多線程計算數(shù)據(jù),最后合并計算結(jié)果的場景。每個parter負責(zé)一部分計算,最后進行數(shù)據(jù)匯總。

以上就是如何淺析Java并發(fā)工具類在AQS實現(xiàn),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:如何淺析Java并發(fā)工具類在AQS實現(xiàn)
分享路徑:http://bm7419.com/article46/jdidhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈、定制開發(fā)、網(wǎng)站排名、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(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)

商城網(wǎng)站建設(shè)