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),大巴車每天發很多回,不像火箭發出去就回不來。