Class FairBlockingQueue<E>
java.lang.Object
org.apache.tomcat.jdbc.pool.FairBlockingQueue<E>
- Type Parameters:
E- Type of element in the queue
- All Implemented Interfaces:
Iterable<E>, Collection<E>, BlockingQueue<E>, Queue<E>
A simple implementation of a blocking queue with fairness waiting. Waiters of method poll(...) are handed items in
the order in which they registered as waiters. Locking is fine grained: a shared lock is only used during the first
level of contention, while waiting is done on a per-waiter
Not all of the methods of the
CountDownLatch, so order is
guaranteed once a thread has registered itself as a waiter - a caller that has not registered yet may still barge
ahead when it races for the shared lock. Not all of the methods of the
BlockingQueue are supported: the ones that are not throw
UnsupportedOperationException.-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprotected classA count down latch that can be used to exchange information.protected classIterator safe from concurrent modification exceptions.protected classA future used to check if a connection has been made available. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionbooleanbooleanaddAll(Collection<? extends E> c) voidFail all the polls that are waiting for an item on this queue.voidclear()booleanbooleancontainsAll(Collection<?> c) intdrainTo(Collection<? super E> c) intdrainTo(Collection<? super E> c, int maxElements) element()booleanReports whether any caller is registered on this queue waiting for an item - through a timed poll or an asynchronous one.booleanisEmpty()iterator()booleanWill always return true, queue is unbounded.booleanWill never time out, as it invokes theoffer(Object)method: the element is always inserted, so the timeout is never applied and, despite the declaration,InterruptedExceptionis never thrown.peek()poll()Fair retrieval of an object in the queue.Request an item from the queue asynchronously.voidintremove()booleanbooleanremoveAll(Collection<?> c) booleanretainAll(Collection<?> c) intsize()take()Delegates topoll(long, TimeUnit)with an effectively unbounded timeout, so the wait also ends the way that method documents for a queue whose waiterscancelWaiters()has failed.Object[]toArray()<T> T[]toArray(T[] a) Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface Collection
equals, hashCode, parallelStream, removeIf, spliterator, stream, toArray
-
Constructor Details
-
FairBlockingQueue
public FairBlockingQueue()Creates a new fair blocking queue.
-
-
Method Details
-
offer
Will always return true, queue is unbounded.- Specified by:
offerin interfaceBlockingQueue<E>- Specified by:
offerin interfaceQueue<E>- Throws:
NullPointerException- - if the specified element is null
-
poll
Fair retrieval of an object in the queue. Objects are returned in the order the threads requested them. If the wait is interrupted but an object was handed over to this waiter all the same, the object is returned and the interrupt status of the calling thread is restored instead of being cleared. On a queue whose waiters thecancelWaiters()method has failed, an empty queue hands back no item right away instead of parking the caller: such a queue is never fed again, so waiting could only end in the same empty-handed return.- Specified by:
pollin interfaceBlockingQueue<E>- Throws:
InterruptedException
-
pollAsync
Request an item from the queue asynchronously. If no item is available, the returned future registers a waiter on the queue. Cancelling the future deregisters that waiter again, provided the item has not already been handed over to the future. A future that is no longer needed must therefore be cancelled, so that a subsequent offer does not hand an item over to a future nobody is waiting on. AFuture.get(long, TimeUnit)call on the future that times out deregisters the waiter in the same way and fails the future terminally, so that every later retrieval from it fails right away instead of waiting for an item that can no longer be handed over. OncecancelWaiters()has been called, no waiter is registered anymore: the returned future is cancelled right away, as the caller that cancelled the waiters offers no further item that could serve it.- Returns:
- - a future pending the result from the queue poll request
-
cancelWaiters
public void cancelWaiters()Fail all the polls that are waiting for an item on this queue. A thread blocked in one of theFuture.get()methods of an asynchronous poll observes aCancellationException, and a waiter of a timedpoll(long, TimeUnit)is woken without an item, the way its timeout ends the wait. Later calls topollAsync()andpoll(long, TimeUnit)do not register a waiter at all. A poll an item has already been handed over to is not failed, it completes with that item as usual.
This makes a queue that is never fed again terminate the callers that wait on it, instead of leaving them parked forever - including the timed waiters, whose own timeout the caller cannot know: the pool hands out waits of unbounded length, where waiting for the timeout would be waiting forever. -
hasRegisteredWaiter
public boolean hasRegisteredWaiter()Reports whether any caller is registered on this queue waiting for an item - through a timed poll or an asynchronous one. A releaser that decides whether an offered item has a prospective consumer cannot see these registrations through the pool's wait counter, which counts only the synchronous borrow waits.- Returns:
trueif at least one caller is registered waiting for an item
-
remove
- Specified by:
removein interfaceBlockingQueue<E>- Specified by:
removein interfaceCollection<E>
-
size
public int size()- Specified by:
sizein interfaceCollection<E>
-
iterator
-
poll
-
contains
- Specified by:
containsin interfaceBlockingQueue<E>- Specified by:
containsin interfaceCollection<E>
-
isEmpty
public boolean isEmpty()- Specified by:
isEmptyin interfaceCollection<E>
-
add
- Specified by:
addin interfaceBlockingQueue<E>- Specified by:
addin interfaceCollection<E>- Specified by:
addin interfaceQueue<E>
-
offer
Will never time out, as it invokes theoffer(Object)method: the element is always inserted, so the timeout is never applied and, despite the declaration,InterruptedExceptionis never thrown.- Specified by:
offerin interfaceBlockingQueue<E>- Throws:
InterruptedException
-
drainTo
- Specified by:
drainToin interfaceBlockingQueue<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
drainTo
- Specified by:
drainToin interfaceBlockingQueue<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
put
- Specified by:
putin interfaceBlockingQueue<E>- Throws:
InterruptedException
-
remainingCapacity
public int remainingCapacity()- Specified by:
remainingCapacityin interfaceBlockingQueue<E>
-
take
Delegates topoll(long, TimeUnit)with an effectively unbounded timeout, so the wait also ends the way that method documents for a queue whose waiterscancelWaiters()has failed.- Specified by:
takein interfaceBlockingQueue<E>- Throws:
InterruptedException
-
addAll
- Specified by:
addAllin interfaceCollection<E>
-
clear
public void clear()- Specified by:
clearin interfaceCollection<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
containsAll
- Specified by:
containsAllin interfaceCollection<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
removeAll
- Specified by:
removeAllin interfaceCollection<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
retainAll
- Specified by:
retainAllin interfaceCollection<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
toArray
- Specified by:
toArrayin interfaceCollection<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
toArray
public <T> T[] toArray(T[] a) - Specified by:
toArrayin interfaceCollection<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
element
- Specified by:
elementin interfaceQueue<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
peek
- Specified by:
peekin interfaceQueue<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-
remove
- Specified by:
removein interfaceQueue<E>- Throws:
UnsupportedOperationException- - this operation is not supported
-