This class implements semaphores, a classic thread synchronization primitive that can be used to implement mutual exclusion and wait/notify-style thread synchronization. A Semaphore maintains some fixed number (specified when the Semaphore( ) constructor is called) of permits. The acquire( ) method blocks until a permit is available, then decrements the number of available permits and returns. The release( ) method does the reverse: it increments the number of permits, possibly unblocking a thread waiting in acquire( ).

If you pass true as the second argument to the Semaphore( ) constructor, the semaphore treats waiting threads fairly by placing them on a FIFO queue in the order they called acquire( ) and granting permits to the threads in this order. This prevents thread starvation.


Figure 16-92. java.util.concurrent.Semaphore

public class Semaphore implements Serializable {
// Public Constructors
     public Semaphore(int permits);  
     public Semaphore(int permits, boolean fair);  
// Public Instance Methods
     public void acquire( ) throws InterruptedException;  
     public void acquire(int permits) throws InterruptedException;  
     public void acquireUninterruptibly( );  
     public void acquireUninterruptibly(int permits);  
     public int availablePermits( );  
     public int drainPermits( );  
     public final int getQueueLength( );  
     public final boolean hasQueuedThreads( );  
     public boolean isFair( ); public ...

Get Java in a Nutshell, 5th Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.