Sunday, February 8, 2015

What is Semaphore with example ?

What is Semaphore?

Semaphore is used to control access to common resource for completing multiple resources. It guards a critical section against entry by more than N threads at a time. The java.util.concurrent.Semaphore  class was first introduced by Java in V 1.5.

It has two main methods():
·         acquire()
·         release()

Semaphore is initialized with a given number of "permits” i.e. counter which keeps track of the number of resources available. When a request comes to resources, Semaphore checks the counter and if it is less than total count then it grant access to resources and subsequently reduces the counter. Similarly while releasing a resources, it increments the count.

Thus, at most N threads can access the acquire method without any release() calls where N is number of permits the semaphore was initialized with.

If the permits is in ON|OFF mode i.e. just one count then it is called binary semaphore.


Suppose there are 5 threads who wants to access particular resources which is guard by Semaphore having permits is 2, i.e. three threads has to wait for a semaphore to be released.

package in.waheed.semaphore.example;
import java.util.concurrent.Semaphore;

 * @author abdul waheed
public class SemaphoreExample {

             * @param args
            public static void main(String args[]) {

                        // Semaphore having counter as 2
                        Semaphore semaphore = new Semaphore(2);

                        // Creating 5 threads
                        SemaphoreTest test1 = new SemaphoreTest(semaphore);
                        SemaphoreTest test2 = new SemaphoreTest(semaphore);
                        SemaphoreTest test3 = new SemaphoreTest(semaphore);
                        SemaphoreTest test4 = new SemaphoreTest(semaphore);
                        SemaphoreTest test5 = new SemaphoreTest(semaphore);

                        // Starting all the threds

class SemaphoreTest extends Thread {
            Semaphore semaphore;
            SemaphoreTest(Semaphore semaphore) {
                        this.semaphore = semaphore;

            public void run() {
                        try {
                                    System.out.println("Acquired : " + this.getName());
                        /*         System.out.println("Available permits : "
                                                            + semaphore.availablePermits());*/
                                    try {
                                    } catch (Exception e) {
                        } catch (InterruptedException ie) {
                        } finally {
                                    System.out.println("Released : " + this.getName());


Acquired: Thread-1
Acquired: Thread-0
Released: Thread-1
Acquired: Thread-4
Acquired: Thread-2
Released: Thread-0
Acquired: Thread-3
Released: Thread-4
Released: Thread-2
Released: Thread-3