Difference between CountDownLatch and CyclicBarrier in Java?
Difference 1:
In CountDownLatch, main thread which mostly invokes latch.await() waits for other threads to call countDown() and count reaches 0. In CyclicBarrier, threads wait for each other to complete their execution and reach at common point after which barrier is opened.
Note in CountDownLatch, it is not necessary same thread calls latch.countDown() 10 times or 10 threads calling latch.countDown and making the counter 0 but in case of CyclicBarrier different threads should reach at the common barrier point.
Let's see example of CyclicBarrier
package com.javabypatel.practice; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierExample { public static void main(String args[]) { final CyclicBarrier cb = new CyclicBarrier(3, new Runnable(){ @Override public void run(){ System.out.println("Start the Game"); } }); Thread player1 = new Thread(new Player(cb), "Thread1"); Thread player2 = new Thread(new Player(cb), "Thread2"); Thread player3 = new Thread(new Player(cb), "Thread3"); player1.start(); player2.start(); player3.start(); } } class Player implements Runnable { private CyclicBarrier barrier; public Player(CyclicBarrier barrier) { this.barrier = barrier; } @Override public void run() { try { System.out.println(Thread.currentThread().getName() + " is waiting on barrier"); barrier.await(); System.out.println(Thread.currentThread().getName() + " has passed the barrier"); } catch (Exception ex) { ex.printStackTrace(); } } }
Output:
Thread1 is waiting on barrier
Thread2 is waiting on barrier
Thread3 is waiting on barrier
Start the Game
Thread3 has passed the barrier
Thread2 has passed the barrier
Thread1 has passed the barrier
Difference 2:
CountDownLatch can not be reused once count reaches 0. CyclicBarrier can be reinitialized once parties reaches 0.
Difference 3:
CountDownLatch calls countDown() method to reduce the counter where as CyclicBarrier calls await() method to reduce the counter. Note, await() method blocks the thread from further execution until all thread reaches to a common barrier, countDown() method doesn't block anything.
Difference 4:
CountDownLatch can not trigger common event when count reaches 0, that is when count reaches 0, it just unblocks the blocked thread and proceed with executing further instructions.
CyclicBarrier can trigger common event (Runnable) once it reaches to a barrier point.
Example: refer above
Difference 5:
CyclicBarrier is used for map-reduce kind of operations, like say we want to count population on India, so we will create say 4 threads which counts the population of East, West, North and South.
Each thread will count the population of its Region, we also need to merge the result when data from all threads is ready until which merging cannot be done.
We can create a CyclicBarrier and block the thread after it finds the count, so all threads are blocked after counting the population of its respective region, once all thread reaches barrier, it is broken and merger(Runnable event) can be executed to count the population.
CountDownLatch is used when we want all thread to reach at common event but doesn't necessarily want to block them at that point and they can proceed after signaling(latch.countDown()), Say for example, if we want to start the client file poller after database service(thread1) and ConnectionPoolService with 100 threads(thread2) is up, so we can wait for thread1 and thread2 to call countDown() after which blocked main thread can proceed with starting client file pooler.
You may also like to see
Advanced Java Multithreading Interview Questions & Answers
Type Casting Interview Questions and Answers In Java?
Exception Handling Interview Question-Answer
Method Overloading - Method Hiding Interview Question-Answer
How is ambiguous overloaded method call resolved in java?
Method Overriding rules in Java
Interface interview questions and answers in Java
Enjoy !!!!
If you find any issue in post or face any error while implementing, Please comment.
Post a Comment