java9 coutdown_Java并发之CountDownLatch
正如每個Java文檔所描述的那樣,CountDownLatch是一個同步工具類,它允許一個或多個線程一直等待,直到其他線程的操作執(zhí)行完后再執(zhí)行。在Java并發(fā)中,countdownlatch的概念是一個常見的面試題,所以一定要確保你很好的理解了它。在這篇文章中,我將會涉及到在Java并發(fā)編 程中跟CountDownLatch相關(guān)的以下幾點(diǎn):
目錄
CountDownLatch是什么?
CountDownLatch如何工作?
在實(shí)時系統(tǒng)中的應(yīng)用場景
應(yīng)用范例
常見的面試題
CountDownLatch是什么
CountDownLatch是在java1.5被引入的,跟它一起被引入的并發(fā)工具類還有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它們都存在于java.util.concurrent包下。CountDownLatch這個類能夠使一個線程等待其他線程完成各自的工作后再執(zhí)行。例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動框架服務(wù)的線程已經(jīng)啟動所有的框架服務(wù)之后再執(zhí)行。
CountDownLatch是通過一個計(jì)數(shù)器來實(shí)現(xiàn)的,計(jì)數(shù)器的初始值為線程的數(shù)量。每當(dāng)一個線程完成了自己的任務(wù)后,計(jì)數(shù)器的值就會減1。當(dāng)計(jì)數(shù)器值到達(dá)0時,它表示所有的線程已經(jīng)完成了任務(wù),然后在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)。
CountDownLatch的偽代碼如下所示:
CountDownLatch如何工作
CountDownLatch.java類中定義的構(gòu)造函數(shù):
構(gòu)造器中的計(jì)數(shù)值(count)實(shí)際上就是閉鎖需要等待的線程數(shù)量。這個值只能被設(shè)置一次,而且CountDownLatch沒有提供任何機(jī)制去重新設(shè)置這個計(jì)數(shù)值。
與CountDownLatch的第一次交互是主線程等待其他線程。主線程必須在啟動其他線程后立即調(diào)用CountDownLatch.await()方法。這樣主線程的操作就會在這個方法上阻塞,直到其他線程完成各自的任務(wù)。
其他N 個線程必須引用閉鎖對象,因?yàn)樗麄冃枰ㄖ狢ountDownLatch對象,他們已經(jīng)完成了各自的任務(wù)。這種通知機(jī)制是通過?CountDownLatch.countDown()方法來完成的;每調(diào)用一次這個方法,在構(gòu)造函數(shù)中初始化的count值就減1。所以當(dāng)N個線程都調(diào) 用了這個方法,count的值等于0,然后主線程就能通過await()方法,恢復(fù)執(zhí)行自己的任務(wù)。
在實(shí)時系統(tǒng)中的使用場景
讓我們嘗試羅列出在java實(shí)時系統(tǒng)中CountDownLatch都有哪些使用場景。我所羅列的都是我所能想到的。如果你有別的可能的使用方法,請?jiān)诹粞岳锪谐鰜?#xff0c;這樣會幫助到大家。
實(shí)現(xiàn)最大的并行性:有時我們想同時啟動多個線程,實(shí)現(xiàn)最大程度的并行性。例如,我們想測試一個單例類。如果我們創(chuàng)建一個初始計(jì)數(shù)為1的CountDownLatch,并讓所有線程都在這個鎖上等待,那么我們可以很輕松地完成測試。我們只需調(diào)用 一次countDown()方法就可以讓所有的等待線程同時恢復(fù)執(zhí)行。
開始執(zhí)行前等待n個線程完成各自任務(wù):例如應(yīng)用程序啟動類要確保在處理用戶請求前,所有N個外部系統(tǒng)已經(jīng)啟動和運(yùn)行了。
死鎖檢測:一個非常方便的使用場景是,你可以使用n個線程訪問共享資源,在每次測試階段的線程數(shù)目是不同的,并嘗試產(chǎn)生死鎖。
CountDownLatch使用例子
在這個例子中,我模擬了一個應(yīng)用程序啟動類,它開始時啟動了n個線程類,這些線程將檢查外部系統(tǒng)并通知閉鎖,并且啟動類一直在閉鎖上等待著。一旦驗(yàn)證和檢查了所有外部服務(wù),那么啟動類恢復(fù)執(zhí)行。
BaseHealthChecker.java:這個類是一個Runnable,負(fù)責(zé)所有特定的外部服務(wù)健康的檢測。它刪除了重復(fù)的代碼和閉鎖的中心控制代碼。
NetworkHealthChecker.java:這個類繼承了BaseHealthChecker,實(shí)現(xiàn)了verifyService()方法。DatabaseHealthChecker.java和CacheHealthChecker.java除了服務(wù)名和休眠時間外,與NetworkHealthChecker.java是一樣的。
ApplicationStartupUtil.java:這個類是一個主啟動類,它負(fù)責(zé)初始化閉鎖,然后等待,直到所有服務(wù)都被檢測完。
現(xiàn)在你可以寫測試代碼去檢測一下閉鎖的功能了。
常見面試題
可以為你的下次面試準(zhǔn)備以下一些CountDownLatch相關(guān)的問題:
解釋一下CountDownLatch概念?
CountDownLatch 和CyclicBarrier的不同之處?
給出一些CountDownLatch使用的例子?
CountDownLatch 類中主要的方法?
總結(jié)
以上是生活随笔為你收集整理的java9 coutdown_Java并发之CountDownLatch的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java下标运算符_《Java从小白到大
- 下一篇: 魔乐手机管家(魔乐手机管家官网)