用讀寫鎖實現(xiàn)CountDownLatch

CountDownLatch 的理解

  1. 功能
    功能方面,該類可以用于很多并發(fā)場景,比如用于多個線程的統(tǒng)一開關,只要把初始count設為1,就可以實現(xiàn)類似于一鍵觸發(fā)的功能,這個可以用于多線程性能測試的內(nèi)容;還有一種情況是用于為某個事件準備多個資源的情況,比如賽跑的情況~~

2.原理
CountDownLatch 是同一個包含一個內(nèi)部類,該類繼承于AbstractQueuedSynchronizer(AQS),使用的是AQS共享鎖的機制,這樣可以保證在count將為零時,能夠用傳遞的方式將隊列內(nèi)等待的線程全部喚醒,同時放出去。

實現(xiàn)CountDownLatch 細節(jié)

  1. 簡單版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ā)庫,說是最輕量的,這里粘貼下地址,來日學習:

地址

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容