CountDownLatch和CyclicBarrier理論上的區別


CountDownLatch和CyclicBarrier理論上的區別

作為理論型的Java選手,在秋招的瘋狂背概念的時候,一直很困惑有什么區別,api上的區別是能理解的,用法上的區別也是可以理解的,比如說:

CountDownLatch是計數器,線程完成一個記錄一個,只不過計數不是遞增而是遞減,而CyclicBarrier更像是一個閥門,需要所有線程都到達,閥門才能打開,然后繼續執行。

但是,為什么大部分人的博客后面都搞一句引用值Java Doc的話,是,Java Doc很權威,但我實在理解不了,多個線程等待多個其他線程和多個線程相互等待有什么區別

CountDownLatch:一個或者多個線程,等待其他多個線程完成某件事情之后才能執行;

CyclicBarrier:多個線程互相等待,直到到達同一個同步點,再繼續一起執行。

Api角度透析

CountDownLatch兩個核心api

等待對象

public boolean await(long timeout, TimeUnit unit)    throws InterruptedException {
}

需求方法

public void countDown() {
 sync.releaseShared(1);
}

CyclicBarrier一個核心api

等待對象

public int await(long timeout, TimeUnit unit)    throws InterruptedException,           BrokenBarrierException,           TimeoutException {    return dowait(true, unit.toNanos(timeout));}

從api就能察覺到兩者的區別,CountDownLatch的兩個api可以在不同的地方調用,這也就決定有等待的一方和進行操作的一方,而CycliBarrier的一個api就顯得只能在一方操作。

回歸到提出的疑問

CountDownLatch:一個或者多個線程,等待其他多個線程完成某件事情之后才能執行;

CyclicBarrier:多個線程互相等待,直到到達同一個同步點,再繼續一起執行。

上面描述的CountDownLatch描述中出現的一個或者多個線程是下圖中右側調用await()等待左側多個線程完成特定事件(acquire),將右側的多個線程比作是乘坐火箭的乘客,左側線程比做成控制台的操作人員們可能會是個合適的比喻,乘客都上火箭后,等待操作台的工作人員們檢測設備,所有設備正常后,發射火箭。

對比來看CyclicBarrier,只有一個api,也像上面所說,只能讓這N個線程相互進行等待,一通通過障礙點,可以比作大巴車,車滿就發車(現實里車不滿也會發),至於出站的時候通不通知站台進行報備就要看站台的大小(是否需要指定構造函數中的Runnable),大巴車每天發很多回,不像火箭發出去就回不來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM