CountDownLatch 的理解
- 功能
功能方面,該類可以用于很多并發(fā)場景,比如用于多個線程的統(tǒng)一開關,只要把初始count設為1,就可以實現(xiàn)類似于一鍵觸發(fā)的功能,這個可以用于多線程性能測試的內(nèi)容;還有一種情況是用于為某個事件準備多個資源的情況,比如賽跑的情況~~
2.原理
CountDownLatch 是同一個包含一個內(nèi)部類,該類繼承于AbstractQueuedSynchronizer(AQS),使用的是AQS共享鎖的機制,這樣可以保證在count將為零時,能夠用傳遞的方式將隊列內(nèi)等待的線程全部喚醒,同時放出去。
實現(xiàn)CountDownLatch 細節(jié)
- 簡單版api
await() // 阻塞當前線程
countdown() // 是狀態(tài)值減一,當為零時釋放所有在阻塞的線程
CountDownLatch (int count) //構造器 初始化狀態(tài)值
2.實現(xiàn)關鍵點
- 阻塞當前線程
- 原子的實現(xiàn)count減法
- 統(tǒng)一釋放所有等待線程
這里按照Doug lea大師在java并發(fā)庫里的寫法,實現(xiàn)起來太麻煩了,望而卻步。
考慮要實現(xiàn)上面三個功能,我就想到了同樣是基于AQS的讀寫鎖,讀鎖可以hold住所有獲取讀鎖的線程,寫鎖的話,大家都能獲取,并且當讀鎖釋放是,能夠實現(xiàn)全部喚醒。
3.問題點與解決辦法
這里的難點在于創(chuàng)建Latch的時候,就要hold住到來await的線程。
所以讀鎖的加鎖和解鎖,都是在MyLatch初始化的時候,在構造器里新開啟一個線程完成的,利用死循環(huán)檢測狀態(tài)值,實現(xiàn)第一時間觸發(fā)。
具體實現(xiàn)
MyCountDownLatch 利用讀寫鎖實現(xiàn)
MyCountDownLatch
MyCountDownLatchTest
下面是運行時的輸出結果
run result
PS:認識的微軟大神向我推他寫的并發(fā)庫,說是最輕量的,這里粘貼下地址,來日學習:
地址