| |
|
| java.lang.Object org.mmbase.util.DijkstraSemaphore
DijkstraSemaphore | public class DijkstraSemaphore (Code) | | Also called counting semaphores, Dijkstra semaphores are used to control access to
a set of resources. A Dijkstra semaphore has a count associated with it and each
acquire() call reduces the count. A thread that tries to acquire() a Dijkstra
semaphore with a zero count blocks until someone else calls release() thus increasing
the count.
When to use
Recommended when applications require a counting semaphore. Implementing
a counting semaphore using wait()/notify() and counters within your application
code makes your code less readable and quickly increases the complexity
(especially when you have the need for multiple counting semaphores). Can also
be used to port code from POSIX environment.
author: Karthik Rangaraju author: Michiel Meeuwissen since: MMBase-1.6 version: $Id: DijkstraSemaphore.java,v 1.8 2005/03/16 19:06:44 michiel Exp $ |
Constructor Summary | |
public | DijkstraSemaphore(int pMaxCount) | public | DijkstraSemaphore(int pMaxCount, int pInitialCount) Creates a Dijkstra semaphore with the specified max count and an initial count
of acquire() operations that are assumed to have already been performed.
Parameters: pMaxCount - is the max semaphores that can be acquired Parameters: pInitialCount - is the current count (setting it to zero means all semaphoreshave already been acquired). |
Method Summary | |
public synchronized void | acquire() If the count is non-zero, acquires a semaphore and decrements the count by 1,
otherwise blocks until a release() is executed by some other thread. | public synchronized void | acquireAll() Tries to acquire all the semaphores thus bringing the count to zero. | public synchronized void | release() Releases a previously acquires semaphore and increments the count by one. | public synchronized void | release(int pCount) Same as release() except that the count is increased by pCount instead of 1. | public synchronized void | releaseAll() Releases all semaphores setting the count to max count. | public void | starvationCheck() This method blocks the calling thread until the count drops to zero.
The method is not stateful and hence a drop to zero will not be recognized
if a release happens before this call. | public synchronized boolean | tryAcquire() Non-blocking version of acquire(). |
DijkstraSemaphore | public DijkstraSemaphore(int pMaxCount)(Code) | | Creates a Dijkstra semaphore with the specified max count and initial count set
to the max count (all resources released)
Parameters: pMaxCount - is the max semaphores that can be acquired |
DijkstraSemaphore | public DijkstraSemaphore(int pMaxCount, int pInitialCount)(Code) | | Creates a Dijkstra semaphore with the specified max count and an initial count
of acquire() operations that are assumed to have already been performed.
Parameters: pMaxCount - is the max semaphores that can be acquired Parameters: pInitialCount - is the current count (setting it to zero means all semaphoreshave already been acquired). 0 <= pInitialCount <= pMaxCount |
release | public synchronized void release()(Code) | | Releases a previously acquires semaphore and increments the count by one. Does not
check if the thread releasing the semaphore was a thread that acquired the
semaphore previously. If more releases are performed than acquires, the count is
not increased beyond the max count specified during construction.
See Also: DijkstraSemaphore.release(int pCount) See Also: DijkstraSemaphore.releaseAll() |
release | public synchronized void release(int pCount)(Code) | | Same as release() except that the count is increased by pCount instead of 1. The
resulting count is capped at max count specified in the constructor
Parameters: pCount - is the amount by which the counter should be incremented See Also: DijkstraSemaphore.release() |
releaseAll | public synchronized void releaseAll()(Code) | | Releases all semaphores setting the count to max count.
Warning: If this method is called by a thread that did not make a corresponding
acquireAll() call, then you better know what you are doing!
See Also: DijkstraSemaphore.acquireAll() |
starvationCheck | public void starvationCheck() throws InterruptedException(Code) | | This method blocks the calling thread until the count drops to zero.
The method is not stateful and hence a drop to zero will not be recognized
if a release happens before this call. You can use this method to implement
threads that dynamically increase the resource pool or that log occurences
of resource starvation. Also called a reverse-sensing semaphore
throws: InterruptedException - if the thread is interrupted while waiting |
tryAcquire | public synchronized boolean tryAcquire()(Code) | | Non-blocking version of acquire().
true if semaphore was acquired (count is decremented by 1), falseotherwise |
|
|
|