更新時(shí)間:2020-04-30 10:59:07 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2274次
基于AQS的前世今生,來學(xué)習(xí)并發(fā)工具類CountDownLatch。本文將從CountDownLatch的應(yīng)用場景、源碼原理解析來學(xué)習(xí)這個(gè)并發(fā)工具類。
1、應(yīng)用場景
CountDownLatch是并發(fā)包中用來控制一個(gè)或者多個(gè)線程等待其他線程完成操作的并發(fā)工具類。現(xiàn)以工作中的一個(gè)場景來描述下CountDownLatch的應(yīng)用,代碼如下:
在分析原理實(shí)現(xiàn)前,總結(jié)下CountDownLatch的作用就是阻塞其他線程直到條件允許后才釋放該阻塞,除了上述這個(gè)小案例,實(shí)際工作中還有很多可以使用CountDownLatch的場景,比如解析Excel文件時(shí)可以同時(shí)解析多個(gè)Sheet頁,所有的Sheet解析完成才算完成了Excel文件的解析。從這個(gè)代碼中也可以看到CountDownLatch的主要方法就是await和countDown,下面將以這兩個(gè)方法來分析下CountDownLatch的原理實(shí)現(xiàn)。
2、源碼原理解析
2.1await方法
調(diào)用await方法會(huì)阻塞當(dāng)前線程直到計(jì)數(shù)器的數(shù)值為0,方法如下:
調(diào)用的是AQS的acquireSharedInterruptibly方法:
其中tryAcquireShared依賴的是Sync的實(shí)現(xiàn),和之前的ReentrantLock、ReentrantReadWriteLock及Semaphore相比,CountDownLatch的Sync只提供了一種方式,代碼如下:
doAcquireSharedInterruptibly方法就不再贅述,和之前Semaphore的實(shí)現(xiàn)是一致的,本質(zhì)上仍然是AQS同步隊(duì)列的入隊(duì)自旋等待。
2.2countDown方法
調(diào)用countDown方法會(huì)將計(jì)數(shù)器的數(shù)值減1直到計(jì)數(shù)器為0,方法如下:
和Semaphore一樣,調(diào)用的是AQS的releaseShared方法:
其中tryReleaseShared依賴的是Sync的實(shí)現(xiàn),和之前的ReentrantLock、ReentrantReadWriteLock及Semaphore相比,CountDownLatch的Sync只提供了一種方式,代碼如下:
喚醒后續(xù)線程節(jié)點(diǎn)的doReleaseShared也不再贅述,和之前Semaphore的實(shí)現(xiàn)是一致的。
總結(jié):CountDownLatch類使用AQS同步狀態(tài)來表示計(jì)數(shù)。在await時(shí),所有的線程進(jìn)入同步隊(duì)列自旋等待,在countDown時(shí),獲取閉鎖成功的線程會(huì)減少閉鎖的計(jì)數(shù)器,同時(shí)喚醒后續(xù)線程取獲取閉鎖,直到await中的計(jì)數(shù)器為0,獲取到閉鎖的線程才可以通過,執(zhí)行下一步操作。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java并發(fā)編程學(xué)習(xí)CountDownLatch”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)