基于AQS的前世今生,來學(xué)習(xí)并發(fā)工具類CountDownLatch。本文將從CountDownLatch的應(yīng)用場景、源碼原理解析來學(xué)習(xí)這個并發(fā)工具類。
1、應(yīng)用場景
CountDownLatch是并發(fā)包中用來控制一個或者多個線程等待其他線程完成操作的并發(fā)工具類?,F(xiàn)以工作中的一個場景來描述下CountDownLatch的應(yīng)用,代碼如下:
在分析原理實現(xiàn)前,總結(jié)下CountDownLatch的作用就是阻塞其他線程直到條件允許后才釋放該阻塞,除了上述這個小案例,實際工作中還有很多可以使用CountDownLatch的場景,比如解析Excel文件時可以同時解析多個Sheet頁,所有的Sheet解析完成才算完成了Excel文件的解析。從這個代碼中也可以看到CountDownLatch的主要方法就是await和countDown,下面將以這兩個方法來分析下CountDownLatch的原理實現(xiàn)。
2、源碼原理解析
2.1await方法
調(diào)用await方法會阻塞當(dāng)前線程直到計數(shù)器的數(shù)值為0,方法如下:
調(diào)用的是AQS的acquireSharedInterruptibly方法:
其中tryAcquireShared依賴的是Sync的實現(xiàn),和之前的ReentrantLock、ReentrantReadWriteLock及Semaphore相比,CountDownLatch的Sync只提供了一種方式,代碼如下:
doAcquireSharedInterruptibly方法就不再贅述,和之前Semaphore的實現(xiàn)是一致的,本質(zhì)上仍然是AQS同步隊列的入隊自旋等待。
2.2countDown方法
調(diào)用countDown方法會將計數(shù)器的數(shù)值減1直到計數(shù)器為0,方法如下:
和Semaphore一樣,調(diào)用的是AQS的releaseShared方法:
其中tryReleaseShared依賴的是Sync的實現(xiàn),和之前的ReentrantLock、ReentrantReadWriteLock及Semaphore相比,CountDownLatch的Sync只提供了一種方式,代碼如下:
喚醒后續(xù)線程節(jié)點的doReleaseShared也不再贅述,和之前Semaphore的實現(xiàn)是一致的。
總結(jié):CountDownLatch類使用AQS同步狀態(tài)來表示計數(shù)。在await時,所有的線程進入同步隊列自旋等待,在countDown時,獲取閉鎖成功的線程會減少閉鎖的計數(shù)器,同時喚醒后續(xù)線程取獲取閉鎖,直到await中的計數(shù)器為0,獲取到閉鎖的線程才可以通過,執(zhí)行下一步操作。
以上就是長沙中公優(yōu)就業(yè)java培訓(xùn)機構(gòu)的小編針對“Java并發(fā)編程學(xué)習(xí)CountDownLatch”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
Java學(xué)習(xí)