Saturday, July 28, 2012

CountDownLatch in Java is a kind of synchronizer which allows one Thread to wait for one or more Threads before starts processing. This is very crucial requirement and often needed in server side core Java application and having this functionality built-in as CountDownLatch greatly simplifies the development. CountDownLatch in Java is introduced on Java 5 along with other concurrent utilities like CyclicBarrier, Semaphore, ConcurrentHashMap and BlockingQueue in java.util.concurrent package. In this Java concurrency tutorial we will what is CountDownLatch in Java, How CountDownLatch works in Java, an example of CountDownLatch in Java and finally some worth noting points about this concurrent utility. You can also implement same functionality using wait and notify mechanism in Java but it requires lot of code and getting it write in first attempt is tricky, With CountDownLatch it can be done in just few lines. CountDownLatch also allows flexibility on number of thread for which main thread should wait, It can wait for one thread or n number of thread, there is not much change on code. Key point is that you need to figure out where to use CountDownLatch in Java application which is not difficult if you understand What is CountDownLatch in Java, What does CountDownLatch do and How CountDownLatch works in Java.

How CountDownLatch works in Java

Now we know What is CountDownLatch in Java, its time to find out How CountDownLatch works in Java. CountDownLatch works in latch principle, main thread will wait until Gate is open. One thread waits for n number of threads specified while creating CountDownLatch in Java. Any thread, usually main thread of application, which calls CountDownLatch.await() will wait until count reaches zero or its interrupted by another Thread. All other thread are required to do count down by calling CountDownLatch.countDown() once they are completed or ready to the job. as soon as count reaches zero, Thread awaiting starts running. One of the disadvantage of CountDownLatch is that its not reusable once count reaches to zero you can not use CountDownLatch any more, but don't worry Java concurrency API has another concurrent utility called CyclicBarrier for such requirements.

CountDownLatch Exmaple in Java

In this section we will see a full featured real world example of using CountDownLatch in Java. In following CountDownLatch example, Java program requires 3 services namely CacheService, AlertService and ValidationService to be started and ready before application can handle any request and this is achieved by using CountDownLatch in Java.

/**
* Service class which will be executed by Thread using CountDownLatch synchronizer.
*/class Service implementsRunnable{privatefinalString name;privatefinalint timeToStart;privatefinalCountDownLatch latch;

Output:
ValidationService is Up
AlertService is Up
CacheService is Up
All services are up, Application is starting now

By looking at output of this CountDownLatch example in Java, you can see that Application is not started until all services started by individual Threads are completed.

When should we use CountDownLatch in Java :

Use CountDownLatch when one of Thread like main thread, require to wait for one or more thread to complete, before its start doing processing. Classical example of using CountDownLatch in Java is any server side core Java application which uses services architecture, where multiple services is provided by multiple threads and application can not start processing until all services have started successfully as shown in our CountDownLatch example.

2) Main Thread wait on Latch by calling CountDownLatch.await() method while other thread calls CountDownLatch.countDown() to inform that they have completed.

That’s all on What is CountDownLatch in Java, What does CountDownLatch do in Java, How CountDownLatch works in Java along with a real life CountDownLatch example in Java. This is a very useful concurrency utility and if you master when to use CountDownLatchand how to use CountDownLatch you will be able to reduce good amount of complex concurrency control code written using wait and notify in Java.

9 comments
:

Praduman
said...

I was looking for a tutorial like this which teaches exactly How to use CountDownLatch in Java. to me concurrency seems more difficult than anything else and I am still learning on how to use Java concurrency API like CyclicBarrier, BlockingQueue etc.Thank you so much for making Java concurrency simple for me, with these How to examples.

- CountDownLatch is a synchronization utility, which allows any Thread to wait for certain number of events, triggered by different thread.

- When each event happens, The Thread which completes that event, calls countDown() method of this class. Which reduces count by one. When count reach zero, which confirms that all event has completed, waiting thread wakes up and do its job.

Hello Shravan, in that case main thread will keep waiting to become count to zero, since it's called latch.await(), which is infinite wait. There is an overloaded version of await(long, TimeUnit) which takes a timeout, which is quite possible if one of thread get stuck and could not call count down. After timeout, main thread will be up.

As per my understanding, in this case the execution of main thread will depend on latch value(till it becomes 0), After value is '0' , now the further processing of main thread will depend on scheduler.

In terms of readability, I would choose the CountdownLatch approach over joining on each thread. This also allows you to change the implementation of Item to maybe submit to an Executor service instead of using Threads directly.