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.
Example:
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
test1.start();
test2.start();
test3.start();
test4.start();
test5.start();
}
}
class
SemaphoreTest extends Thread {
Semaphore semaphore;
SemaphoreTest(Semaphore semaphore) {
this.semaphore =
semaphore;
}
public void run() {
try {
semaphore.acquire();
System.out.println("Acquired
: " + this.getName());
/* System.out.println("Available
permits : "
+
semaphore.availablePermits());*/
try
{
sleep(5000);
} catch
(Exception e) {
}
} catch
(InterruptedException ie) {
} finally {
semaphore.release();
System.out.println("Released
: " + this.getName());
}
}
}
Output:
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