Package rx.internal.util.atomic
Class SpscUnboundedAtomicArrayQueue<T>
- java.lang.Object
-
- rx.internal.util.atomic.SpscUnboundedAtomicArrayQueue<T>
-
- Type Parameters:
T- the value type held by this queue
- All Implemented Interfaces:
java.lang.Iterable<T>,java.util.Collection<T>,java.util.Queue<T>
public final class SpscUnboundedAtomicArrayQueue<T> extends java.lang.Object implements java.util.Queue<T>A single-producer single-consumer queue with unbounded capacity.The implementation uses fixed, power-of-2 arrays to store elements and turns into a linked-list like structure if the production overshoots the consumption.
Note that the minimum capacity of the 'islands' are 8 due to how the look-ahead optimization works.
The implementation uses field updaters and thus should be platform-safe.
-
-
Field Summary
Fields Modifier and Type Field Description (package private) java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object>consumerBuffer(package private) java.util.concurrent.atomic.AtomicLongconsumerIndex(package private) intconsumerMaskprivate static java.lang.ObjectHAS_NEXT(package private) static intMAX_LOOK_AHEAD_STEP(package private) java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object>producerBuffer(package private) java.util.concurrent.atomic.AtomicLongproducerIndex(package private) longproducerLookAhead(package private) intproducerLookAheadStep(package private) intproducerMask
-
Constructor Summary
Constructors Constructor Description SpscUnboundedAtomicArrayQueue(int bufferSize)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description booleanadd(T e)booleanaddAll(java.util.Collection<? extends T> c)private voidadjustLookAheadStep(int capacity)private static intcalcDirectOffset(int index)private static intcalcWrappedOffset(long index, int mask)voidclear()booleancontains(java.lang.Object o)booleancontainsAll(java.util.Collection<?> c)Telement()booleanisEmpty()java.util.Iterator<T>iterator()private longlpConsumerIndex()private longlpProducerIndex()private longlvConsumerIndex()private static <E> java.lang.ObjectlvElement(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, int offset)private java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object>lvNext(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> curr)private longlvProducerIndex()private TnewBufferPeek(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> nextBuffer, long index, int mask)private TnewBufferPoll(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> nextBuffer, long index, int mask)booleanoffer(T e)Tpeek()Tpoll()Tremove()booleanremove(java.lang.Object o)booleanremoveAll(java.util.Collection<?> c)private voidresize(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> oldBuffer, long currIndex, int offset, T e, long mask)booleanretainAll(java.util.Collection<?> c)intsize()private voidsoConsumerIndex(long v)private static voidsoElement(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, int offset, java.lang.Object e)private voidsoNext(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> curr, java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> next)private voidsoProducerIndex(long v)java.lang.Object[]toArray()<E> E[]toArray(E[] a)private booleanwriteToQueue(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, T e, long index, int offset)-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
-
-
-
Field Detail
-
MAX_LOOK_AHEAD_STEP
static final int MAX_LOOK_AHEAD_STEP
-
producerIndex
final java.util.concurrent.atomic.AtomicLong producerIndex
-
producerLookAheadStep
int producerLookAheadStep
-
producerLookAhead
long producerLookAhead
-
producerMask
int producerMask
-
producerBuffer
java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> producerBuffer
-
consumerMask
int consumerMask
-
consumerBuffer
java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> consumerBuffer
-
consumerIndex
final java.util.concurrent.atomic.AtomicLong consumerIndex
-
HAS_NEXT
private static final java.lang.Object HAS_NEXT
-
-
Method Detail
-
offer
public boolean offer(T e)
This implementation is correct for single producer thread use only.
- Specified by:
offerin interfacejava.util.Queue<T>
-
writeToQueue
private boolean writeToQueue(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, T e, long index, int offset)
-
resize
private void resize(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> oldBuffer, long currIndex, int offset, T e, long mask)
-
soNext
private void soNext(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> curr, java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> next)
-
lvNext
private java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> lvNext(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> curr)
-
poll
public T poll()
This implementation is correct for single consumer thread use only.
- Specified by:
pollin interfacejava.util.Queue<T>
-
newBufferPoll
private T newBufferPoll(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> nextBuffer, long index, int mask)
-
peek
public T peek()
This implementation is correct for single consumer thread use only.
- Specified by:
peekin interfacejava.util.Queue<T>
-
clear
public void clear()
- Specified by:
clearin interfacejava.util.Collection<T>
-
newBufferPeek
private T newBufferPeek(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> nextBuffer, long index, int mask)
-
size
public int size()
- Specified by:
sizein interfacejava.util.Collection<T>
-
isEmpty
public boolean isEmpty()
- Specified by:
isEmptyin interfacejava.util.Collection<T>
-
adjustLookAheadStep
private void adjustLookAheadStep(int capacity)
-
lvProducerIndex
private long lvProducerIndex()
-
lvConsumerIndex
private long lvConsumerIndex()
-
lpProducerIndex
private long lpProducerIndex()
-
lpConsumerIndex
private long lpConsumerIndex()
-
soProducerIndex
private void soProducerIndex(long v)
-
soConsumerIndex
private void soConsumerIndex(long v)
-
calcWrappedOffset
private static int calcWrappedOffset(long index, int mask)
-
calcDirectOffset
private static int calcDirectOffset(int index)
-
soElement
private static void soElement(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, int offset, java.lang.Object e)
-
lvElement
private static <E> java.lang.Object lvElement(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, int offset)
-
iterator
public java.util.Iterator<T> iterator()
-
contains
public boolean contains(java.lang.Object o)
- Specified by:
containsin interfacejava.util.Collection<T>
-
toArray
public java.lang.Object[] toArray()
- Specified by:
toArrayin interfacejava.util.Collection<T>
-
toArray
public <E> E[] toArray(E[] a)
- Specified by:
toArrayin interfacejava.util.Collection<T>
-
remove
public boolean remove(java.lang.Object o)
- Specified by:
removein interfacejava.util.Collection<T>
-
containsAll
public boolean containsAll(java.util.Collection<?> c)
- Specified by:
containsAllin interfacejava.util.Collection<T>
-
addAll
public boolean addAll(java.util.Collection<? extends T> c)
- Specified by:
addAllin interfacejava.util.Collection<T>
-
removeAll
public boolean removeAll(java.util.Collection<?> c)
- Specified by:
removeAllin interfacejava.util.Collection<T>
-
retainAll
public boolean retainAll(java.util.Collection<?> c)
- Specified by:
retainAllin interfacejava.util.Collection<T>
-
add
public boolean add(T e)
-
-