Java面試題解析:CountdownLatch和CycliWJar有什麼差別?
一位工作5年的小夥伴在面試的時候被問到這樣一個問題,說看的當爛企和 CountdownLatch有什麼差別?這個問題對于很多人都比較陌生,但是對于接觸過并發程式設計的小夥伴來說還是比較簡單的。今天我給大家分享一下我對這個問題的了解。這道面試題的文字版我已經整理在20萬字的文檔裡面了,有需要的小夥伴可以在評論區領取。
·首先來看CountDownLatch,它是一個組合詞,CountDown的意思是倒計時。Latch它的意思是門闩的意思也被翻譯成發令槍,在JDK中注釋是這樣的,翻譯過來就是說讓一個或者多個線程持續等待,直到等到其它多個線程執行一組的操作。全部完成以後這些等待的線程才會繼續執行。
就好比是有多位選手參加一場百米比賽,裁判員需要等待全部選手就緒,并且在同一起跑線上。然後裁判員就會發出号令各就位預備跑。随着發令槍一響所有的選手才會開始全部起跑。在這個場景中各個參賽選手就是線程,而裁判就是CountDownLatch。在實際開發中有以下兩個使用場景可以使用到CountDownLatch來實作。
·第一個就是讓單個線程等待多個線程的場景。比如說一個服務需要從多個遠端接口去擷取資料,可以去建立多個線程來分别調用遠端的接口,等待所有的接口。全部擷取到傳回值之後主線程才繼續往下執行,比如像并發計算結果彙總等等。
·第二個就是讓多個線程等待的場景。比如說模拟秒殺場景,讓一種線程同時等待,同時去恢複執行。實作最大程度的可能性。需要注意的是當高并發請求的時候看到Countdownlatch的await方法有可能會引起死鎖。
因為如果線程池中的線程數量比較少,在高并發的時候會出現多個請求占用了全部的線程,但是每個請求又需要await()其它線程,被等待的線程拿不到線程資源無法執行進而導緻多個請求無法同時進入線程阻塞,最後形成死鎖。
當然可以使用自定義的線程池來擴大線程數量,并且建立線程的拒絕機制來解決死鎖問題。
再來看線程裡的線程也是一個組合詞,其中Cyclic的意思是循環,而Barrier的意思是屏障又被翻譯成栅欄。在JDK中注釋是這樣描述的,翻譯過來總結為以下三點:
·第一個是線程裡的線程是一個同步的輔助類,它允許一組線程互相等待,直到所有的線程都達到一個公共的屏障點。
·第二個是在程式中有固定的數量的線程,這些線程有時候必需要等待彼此,這種情況下使用Cyclic棱角r很有幫助。
·第三個是這個屏障之是以要使用循環修飾是因為所有線程的被釋放彼此之後這個屏障可以去重複使用,從字面上了解它的功能和CountdownLatch是非常相似的,也就是說要等待所有參加比賽的選手全部就緒以後才能開始起跑。它是另外一種多線程并發的控制工具,和CountdownLatch不同的是Cyclic棱角r可以重複使用。在實際開發中再給你一個CyclicBarrier可以用于多線程計數資料,最後合并計算結果的應用場景。
比如說需要計算N組人的一年的平均工資,每組需要多個線程進行并行計算,計算完一組再開始計算下一組,這樣就需要多輪并行計算,在這個場景下CyclicBarrier比CountDownLatch更适合。
最後我給大家總結一下CountDownLatch和CyclicBarrier的差別,我從以下四個方面來分析。
·第一個是CountDownLatch的計數器隻能使用一次,而CyclicBarrier的計數器可以使用reset()方法來重置,反複使用。
·第二個是yclic·r它能處理更為複雜的業務場景,比如計算發生錯誤可以結束阻塞、重置電腦以及重新執行程式。
·第三個是Cyclic棱角r提供了getNumberWaiting(方法可以去獲得)。
Cyclic回應核長度的數目數目還提供了一絲蜂膠()方法,可以去判斷主攝性線索是否被中斷。
兩者差別結尾:
·第四個,CountDownLatch 會阻塞主程,而Cyclic男方不會去阻塞主工程,隻會阻塞子線程。
以上就是我對Java面試奇和薩克裡克拜瑞的了解,我是被程式設計耽誤的文藝Tom,如果我的分享對你有幫助,請你動動手指一鍵三連,分享給更多的人。關注我,面試不再難!