Hazelcast – ICountDownLatch

The java.util.concurrent.CountDownLatch provides a way for threads to wait, while other threads complete a set of operations in a multithreaded environment in a JVM.

Similarly, ICountDownLatch provides a distributed version of Java CountDownLatch. It provides similar functions: set count, countDown, await, etc.

A major difference between ICountDownLatch and Java CountDownLatch is that while Java CountDownLatch provides protection of critical section from threads in a single JVM, ICountDownLatch provides synchronization for threads in a single JVM as well as multiple JVMs.

ICountDownLatch has one synchronous backup which means if we have a setup where we have, say, 5 JVMs running, only two JVMs will hold this latch.

Setting Latch & Awaiting Latch

Let’s execute the following code on two JVMs. The master code on one and worker code on the other. The code is supposed to make the worker thread wait till the master thread completes.

Example

The first piece is the master code which creates a latch and counts it down.

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast=Hazelcast.newHazelcastInstance();
   // create a lock
   ICountDownLatch countDownLatch=hazelcast.getCountDownLatch("count_down_1");
   System.out.println("Setting counter");
   countDownLatch.trySetCount(2);
   Thread.sleep(2000);
   System.out.println("Counting down");
   countDownLatch.countDown();
   Thread.sleep(2000);
   System.out.println("Counting down");
   countDownLatch.countDown();
   System.exit(0);
}

The second piece is of worker code which creates a latch and counts it down.

public static void main(String... args) throws IOException, InterruptedException {
   //initialize hazelcast instance
   HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
   // create a lock
   ICountDownLatch countDownLatch=hazelcast.getCountDownLatch("count_down_1");
   countDownLatch.await(5000, TimeUnit.MILLISECONDS);
   System.out.println("Worker successful");
   System.exit(0);
}

Output

The output for the code shows that the worker prints only after the countdown was completed to 0.

Setting counter
Counting down
Counting down
Worker successful

Useful Methods

Sr.NoFunction Name & Description
1await() Wait for the latch’s count to reach to zero before proceeding
2countDown() Decrement the countdown latch
3trySetCount(int count) Set the count of the latch
4getCount() Get the current count of the latch

Leave a Reply