public class MpmcUnboundedXaddArrayQueue<E> extends MpUnboundedXaddArrayQueue<MpmcUnboundedXaddChunk<E>,E>
MpmcArrayQueue
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 |
---|
MpmcUnboundedXaddArrayQueue(int chunkSize) |
MpmcUnboundedXaddArrayQueue(int chunkSize,
int maxPooledChunks) |
Modifier and Type | Method and Description |
---|---|
int |
fill(MessagePassingQueue.Supplier<E> s,
int limit)
Stuff the queue with up to limit elements from the supplier.
|
(package private) MpmcUnboundedXaddChunk<E> |
newChunk(long index,
MpmcUnboundedXaddChunk<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. |
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 E |
switchToNextConsumerChunkAndPoll(MpmcUnboundedXaddChunk<E> cChunk,
MpmcUnboundedXaddChunk<E> next,
long expectedChunkIndex) |
appendNextChunks, capacity, chunkSize, currentConsumerIndex, currentProducerIndex, drain, drain, drain, fill, 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 MpmcUnboundedXaddArrayQueue(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 MpmcUnboundedXaddArrayQueue(int chunkSize)
final MpmcUnboundedXaddChunk<E> newChunk(long index, MpmcUnboundedXaddChunk<E> prev, int chunkSize, boolean pooled)
newChunk
in class MpUnboundedXaddArrayQueue<MpmcUnboundedXaddChunk<E>,E>
public boolean offer(E e)
MessagePassingQueue
Queue.offer(Object)
interface.e
- not null
, will throw NPE if it ispublic E poll()
MessagePassingQueue
Queue.poll()
interface.null
iff emptyprivate E switchToNextConsumerChunkAndPoll(MpmcUnboundedXaddChunk<E> cChunk, MpmcUnboundedXaddChunk<E> next, long expectedChunkIndex)
public 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, 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.