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.
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
Comments
Post a Comment