public class SpscUnboundedAtomicArrayQueue<E> extends java.util.AbstractQueue<E> implements QueueProgressIndicators
Modifier and Type | Field and Description |
---|---|
protected java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> |
consumerBuffer |
protected java.util.concurrent.atomic.AtomicLong |
consumerIndex |
protected int |
consumerMask |
private static java.lang.Object |
HAS_NEXT |
(package private) static int |
MAX_LOOK_AHEAD_STEP |
protected java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> |
producerBuffer |
protected java.util.concurrent.atomic.AtomicLong |
producerIndex |
protected long |
producerLookAhead |
protected int |
producerLookAheadStep |
protected int |
producerMask |
Constructor and Description |
---|
SpscUnboundedAtomicArrayQueue(int chunkSize) |
Modifier and Type | Method and Description |
---|---|
private void |
adjustLookAheadStep(int capacity) |
private static int |
calcDirectOffset(int index) |
private static int |
calcWrappedOffset(long index,
int mask) |
long |
currentConsumerIndex()
This method has no concurrent visibility semantics.
|
long |
currentProducerIndex()
This method has no concurrent visibility semantics.
|
java.util.Iterator<E> |
iterator() |
private long |
lpConsumerIndex() |
private long |
lpProducerIndex() |
private long |
lvConsumerIndex() |
private static <E> java.lang.Object |
lvElement(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 long |
lvProducerIndex() |
private E |
newBufferPeek(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> nextBuffer,
long index,
int mask) |
private E |
newBufferPoll(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer,
long index,
int mask) |
boolean |
offer(E e) |
E |
peek() |
E |
poll() |
private void |
resize(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> oldBuffer,
long currIndex,
int offset,
E e,
long mask) |
int |
size() |
private void |
soConsumerIndex(long v) |
private static void |
soElement(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer,
int offset,
java.lang.Object e) |
private void |
soNext(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> curr,
java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> next) |
private void |
soProducerIndex(long v) |
private boolean |
writeToQueue(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer,
E e,
long index,
int offset) |
contains, containsAll, isEmpty, remove, removeAll, retainAll, toArray, toArray, toString
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
static final int MAX_LOOK_AHEAD_STEP
protected final java.util.concurrent.atomic.AtomicLong producerIndex
protected int producerLookAheadStep
protected long producerLookAhead
protected int producerMask
protected java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> producerBuffer
protected int consumerMask
protected java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> consumerBuffer
protected final java.util.concurrent.atomic.AtomicLong consumerIndex
private static final java.lang.Object HAS_NEXT
public SpscUnboundedAtomicArrayQueue(int chunkSize)
public final java.util.Iterator<E> iterator()
public final boolean offer(E e)
This implementation is correct for single producer thread use only.
offer
in interface java.util.Queue<E>
private boolean writeToQueue(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, E e, long index, int offset)
private void resize(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> oldBuffer, long currIndex, int offset, E e, long mask)
private void soNext(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> curr, java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> next)
private java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> lvNext(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> curr)
public final E poll()
This implementation is correct for single consumer thread use only.
poll
in interface java.util.Queue<E>
private E newBufferPoll(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, long index, int mask)
public final E peek()
This implementation is correct for single consumer thread use only.
peek
in interface java.util.Queue<E>
private E newBufferPeek(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> nextBuffer, long index, int mask)
public final int size()
private void adjustLookAheadStep(int capacity)
private long lvProducerIndex()
private long lvConsumerIndex()
private long lpProducerIndex()
private long lpConsumerIndex()
private void soProducerIndex(long v)
private void soConsumerIndex(long v)
private static int calcWrappedOffset(long index, int mask)
private static int calcDirectOffset(int index)
private static void soElement(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, int offset, java.lang.Object e)
private static <E> java.lang.Object lvElement(java.util.concurrent.atomic.AtomicReferenceArray<java.lang.Object> buffer, int offset)
public long currentProducerIndex()
QueueProgressIndicators
currentProducerIndex
in interface QueueProgressIndicators
public long currentConsumerIndex()
QueueProgressIndicators
currentConsumerIndex
in interface QueueProgressIndicators