public class MpscUnboundedXaddArrayQueue<E> extends MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,E>
MpscUnboundedArrayQueue
it is designed to provide a better scaling when more
producers are concurrently offering.poll()
could spin while awaiting a new element to be available:
to avoid this behaviour relaxedPoll()
should be used instead, accounting for the semantic differences
between the twos.MessagePassingQueue.Consumer<T>, MessagePassingQueue.ExitCondition, MessagePassingQueue.Supplier<T>, MessagePassingQueue.WaitStrategy
chunkMask, chunkShift, freeChunksPool, maxPooledChunks
b000, b001, b002, b003, b004, b005, b006, b007, b010, b011, b012, b013, b014, b015, b016, b017, b020, b021, b022, b023, b024, b025, b026, b027, b030, b031, b032, b033, b034, b035, b036, b037, b040, b041, b042, b043, b044, b045, b046, b047, b050, b051, b052, b053, b054, b055, b056, b057, b060, b061, b062, b063, b064, b065, b066, b067, b070, b071, b072, b073, b074, b075, b076, b077, b100, b101, b102, b103, b104, b105, b106, b107, b110, b111, b112, b113, b114, b115, b116, b117, b120, b121, b122, b123, b124, b125, b126, b127, b130, b131, b132, b133, b134, b135, b136, b137, b140, b141, b142, b143, b144, b145, b146, b147, b150, b151, b152, b153, b154, b155, b156, b157, b160, b161, b162, b163, b164, b165, b166, b167
b170, b171, b172, b173, b174, b175, b176, b177
UNBOUNDED_CAPACITY
Constructor and Description |
---|
MpscUnboundedXaddArrayQueue(int chunkSize) |
MpscUnboundedXaddArrayQueue(int chunkSize,
int maxPooledChunks) |
Modifier and Type | Method and Description |
---|---|
int |
drain(MessagePassingQueue.Consumer<E> c,
int limit)
Remove up to limit elements from the queue and hand to consume.
|
int |
fill(MessagePassingQueue.Supplier<E> s)
Stuff the queue with elements from the supplier.
|
int |
fill(MessagePassingQueue.Supplier<E> s,
int limit)
Stuff the queue with up to limit elements from the supplier.
|
(package private) MpscUnboundedXaddChunk<E> |
newChunk(long index,
MpscUnboundedXaddChunk<E> prev,
int chunkSize,
boolean pooled) |
boolean |
offer(E e)
Called from a producer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.offer(Object) interface. |
E |
peek()
Called from the consumer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.peek() interface. |
E |
poll()
Called from the consumer thread subject to the restrictions appropriate to the implementation and
according to the
Queue.poll() interface. |
private MpscUnboundedXaddChunk<E> |
pollNextBuffer(MpscUnboundedXaddChunk<E> cChunk,
long cIndex) |
E |
relaxedPeek()
Called from the consumer thread subject to the restrictions appropriate to the implementation.
|
E |
relaxedPoll()
Called from the consumer thread subject to the restrictions appropriate to the implementation.
|
private MpscUnboundedXaddChunk<E> |
spinForNextIfNotEmpty(MpscUnboundedXaddChunk<E> cChunk,
long cIndex) |
appendNextChunks, capacity, chunkSize, currentConsumerIndex, currentProducerIndex, drain, drain, fill, isEmpty, iterator, maxPooledChunks, moveToNextConsumerChunk, producerChunkForIndex, relaxedOffer, size, toString
casConsumerIndex, lpConsumerChunk, lpConsumerIndex, lvConsumerChunk, lvConsumerIndex, soConsumerChunk, soConsumerIndex
casProducerChunkIndex, lvProducerChunk, lvProducerChunkIndex, soProducerChunk, soProducerChunkIndex
getAndAddProducerIndex, getAndIncrementProducerIndex, lvProducerIndex
contains, containsAll, remove, removeAll, retainAll, toArray, toArray
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
clear
public MpscUnboundedXaddArrayQueue(int chunkSize, int maxPooledChunks)
chunkSize
- The buffer size to be used in each chunk of this queuemaxPooledChunks
- The maximum number of reused chunks kept around to avoid allocation, chunks are pre-allocatedpublic MpscUnboundedXaddArrayQueue(int chunkSize)
final MpscUnboundedXaddChunk<E> newChunk(long index, MpscUnboundedXaddChunk<E> prev, int chunkSize, boolean pooled)
newChunk
in class MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,E>
public boolean offer(E e)
MessagePassingQueue
Queue.offer(Object)
interface.e
- not null
, will throw NPE if it isprivate MpscUnboundedXaddChunk<E> pollNextBuffer(MpscUnboundedXaddChunk<E> cChunk, long cIndex)
private MpscUnboundedXaddChunk<E> spinForNextIfNotEmpty(MpscUnboundedXaddChunk<E> cChunk, long cIndex)
public E poll()
MessagePassingQueue
Queue.poll()
interface.null
iff emptypublic E peek()
MessagePassingQueue
Queue.peek()
interface.null
iff emptypublic E relaxedPoll()
MessagePassingQueue
Queue.poll()
this method may return null
without the queue being empty.null
if unable to pollpublic E relaxedPeek()
MessagePassingQueue
Queue.peek()
this method may return null
without the queue being empty.null
if unable to peekpublic int fill(MessagePassingQueue.Supplier<E> s)
MessagePassingQueue
while(relaxedOffer(s.get());There's no strong commitment to the queue being full at the end of a fill. Called from a producer thread subject to the restrictions appropriate to the implementation.
Unbounded queues will fill up the queue with a fixed amount rather than fill up to oblivion.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Supplier.get()
make sure you have read
and understood these before using this method.
fill
in interface MessagePassingQueue<E>
fill
in class MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,E>
public int drain(MessagePassingQueue.Consumer<E> c, int limit)
MessagePassingQueue
M m;
int i = 0;
for(;i < limit && (m = relaxedPoll()) != null; i++){
c.accept(m);
}
return i;
There's no strong commitment to the queue being empty at the end of a drain. Called from a consumer thread subject to the restrictions appropriate to the implementation.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Consumer.accept(T)
make sure you have read
and understood these before using this method.
drain
in interface MessagePassingQueue<E>
drain
in class MpUnboundedXaddArrayQueue<MpscUnboundedXaddChunk<E>,E>
public int fill(MessagePassingQueue.Supplier<E> s, int limit)
MessagePassingQueue
for(int i=0; i < limit && relaxedOffer(s.get()); i++);
There's no strong commitment to the queue being full at the end of a fill. Called from a producer
thread subject to the restrictions appropriate to the implementation.
WARNING: Explicit assumptions are made with regards to MessagePassingQueue.Supplier.get()
make sure you have read
and understood these before using this method.