中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

如何淺析Java并發(fā)工具類在AQS實現(xiàn)-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元林甸做網(wǎng)站,已為上家服務(wù),為林甸各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

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

AQS維護(hù)了一個volatile int state(代表共享資源)和一個FIFO線程等待隊列(多線程爭用資源被阻塞時會進(jìn)入此隊列),用于后續(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、自定義同步器的方法

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

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

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

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

tryAcquireShared(int):共享方式。嘗試獲取資源。負(fù)數(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ù)器值到達(dá)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ù)來進(jìn)行限流。

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

7、CyclicBarrier

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

常見應(yīng)用場景

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

以上就是如何淺析Java并發(fā)工具類在AQS實現(xiàn),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前文章:如何淺析Java并發(fā)工具類在AQS實現(xiàn)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://www.rwnh.cn/article10/hsjgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化ChatGPT、網(wǎng)站導(dǎo)航、手機網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)

廣告

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

微信小程序開發(fā)
醴陵市| 通河县| 封开县| 德昌县| 安吉县| 尼木县| 仪征市| 秭归县| 旬阳县| 齐齐哈尔市| 繁峙县| 沈丘县| 嘉义县| 邛崃市| 新乡市| 新津县| 固镇县| 南宫市| 台州市| 墨玉县| 石嘴山市| 南华县| 黔西| 两当县| 博白县| 大名县| 渝中区| 新乐市| 渭南市| 定南县| 威海市| 松江区| 彭泽县| 辛集市| 株洲市| 黑水县| 逊克县| 兴安县| 广汉市| 宜州市| 桦甸市|