Semaphore in Java with Example

In computer science, particularly in operating systems, a semaphore is a variable or abstract data type that provides a simple but useful abstraction for controlling access, by multiple processes, to a common resource in a parallel programming or a multi user environment. Semaphores which allow an arbitrary resource count are called counting semaphores, while semaphores which are restricted to the values 0 and 1 (or locked/unlocked, unavailable/available) are called binary semaphores.

Counting semaphores control the number of activities that can access a certain resource or activity at the same time.  They can be used to implement resource pools. A Semaphore manages a set of virtual permits to access a certain resource or activity. The initial number of permits is passed to the Semaphore constructor. Activities can acquire permits and release permits. If no permit is available, acquire blocks until one is available or until interrupted or the operation times out. The release method returns a permit to the semaphore. As binary semaphores are restricted to the values 0 and 1, they can be used for mutual exclusion; whoever holds the only permit can access the resource.

 

Counting Semaphore Example – SemaphoreDemo.java

import java.util.Date;

import java.util.concurrent.Semaphore;

 

public class SemaphoreDemo {

 

         public void DemoSemaphore(int capacity) {

 

                 final Semaphore available = new Semaphore(capacity, true);

                 String name = "";

 

                 for (int i = 0; i < 5; i++) {

                          name = "MyThread-" + (i + 1);

                          new Thread(name) {

                                  @Override

                                  public void run() {

                                           try {

                                               available.acquire();

                                               System.out.println("Started " + Thread.currentThread() + " at " + new Date());

                                               Thread.sleep(5000);

                                               System.out.println("Exiting " + Thread.currentThread() + " at "  + new Date());

                                               available.release();

                                           } catch (InterruptedException e) {

                                                   e.printStackTrace();

                                           }

                                  }

                          }.start();

                 }

         }

 

         public static void main(String[] args) {

 

                 SemaphoreDemo sD = new SemaphoreDemo();

                 sD.DemoSemaphore(2);

         }

 

}

 

Output

Started Thread[MyThread-1,5,main] at Mon Jul 08 11:01:39 IST 2013

Started Thread[MyThread-2,5,main] at Mon Jul 08 11:01:39 IST 2013

Exiting Thread[MyThread-2,5,main] at Mon Jul 08 11:01:44 IST 2013

Started Thread[MyThread-3,5,main] at Mon Jul 08 11:01:44 IST 2013

Exiting Thread[MyThread-1,5,main] at Mon Jul 08 11:01:44 IST 2013

Started Thread[MyThread-5,5,main] at Mon Jul 08 11:01:44 IST 2013

Exiting Thread[MyThread-5,5,main] at Mon Jul 08 11:01:49 IST 2013

Exiting Thread[MyThread-3,5,main] at Mon Jul 08 11:01:49 IST 2013

Started Thread[MyThread-4,5,main] at Mon Jul 08 11:01:49 IST 2013

Exiting Thread[MyThread-4,5,main] at Mon Jul 08 11:01:54 IST 2013

 

Note:

Here we create a semaphore with initial capacity of 2. We also create and start 5 threads using a “for loop”. Only 2 threads can acquire the permit at one time and others have to wait. Only MyThread-1 and MyThread-2 acquires the permit initially at 11:01:39. Once MyThread-2 releases the permit and exit at 11:01:44, MyThread-3 acquires the permit and gets started. Similarly MyThread-5 is started after MyThread-1 releases the permit. At any time only two threads have acquired the permit.

 

Quick Notes Finder Tags

Activities (1) advanced java (1) agile (3) App Servers (6) archived notes (2) Arrays (1) Best Practices (12) Best Practices (Design) (3) Best Practices (Java) (7) Best Practices (Java EE) (1) BigData (3) Chars & Encodings (6) coding problems (2) Collections (15) contests (3) Core Java (All) (55) course plan (2) Database (12) Design patterns (8) dev tools (3) downloads (2) eclipse (9) Essentials (1) examples (14) Exception (1) Exceptions (4) Exercise (1) exercises (6) Getting Started (18) Groovy (2) hadoop (4) hibernate (77) hibernate interview questions (6) History (1) Hot book (5) http monitoring (2) Inheritance (4) intellij (1) java 8 notes (4) Java 9 (1) Java Concepts (7) Java Core (9) java ee exercises (1) java ee interview questions (2) Java Elements (16) Java Environment (1) Java Features (4) java interview points (4) java interview questions (4) javajee initiatives (1) javajee thoughts (3) Java Performance (6) Java Programmer 1 (11) Java Programmer 2 (7) Javascript Frameworks (1) Java SE Professional (1) JPA 1 - Module (6) JPA 1 - Modules (1) JSP (1) Legacy Java (1) linked list (3) maven (1) Multithreading (16) NFR (1) No SQL (1) Object Oriented (9) OCPJP (4) OCPWCD (1) OOAD (3) Operators (4) Overloading (2) Overriding (2) Overviews (1) policies (1) programming (1) Quartz Scheduler (1) Quizzes (17) RabbitMQ (1) references (2) restful web service (3) Searching (1) security (10) Servlets (8) Servlets and JSP (31) Site Usage Guidelines (1) Sorting (1) source code management (1) spring (4) spring boot (3) Spring Examples (1) Spring Features (1) spring jpa (1) Stack (1) Streams & IO (3) Strings (11) SW Developer Tools (2) testing (1) troubleshooting (1) user interface (1) vxml (8) web services (1) Web Technologies (1) Web Technology Books (1) youtube (1)