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