Class MpmcUnboundedXaddArrayQueue<E>

All Implemented Interfaces:
Iterable<E>, Collection<E>, Queue<E>, IndexedQueueSizeUtil.IndexedQueue, MessagePassingQueue<E>, QueueProgressIndicators

public class MpmcUnboundedXaddArrayQueue<E> extends MpUnboundedXaddArrayQueue<MpmcUnboundedXaddChunk<E>,E>
An MPMC array queue which grows unbounded in linked chunks.
Differently from MpmcArrayQueue it is designed to provide a better scaling when more producers are concurrently offering.
Users should be aware that 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.
  • Constructor Details

    • MpmcUnboundedXaddArrayQueue

      public MpmcUnboundedXaddArrayQueue(int chunkSize, int maxPooledChunks)
      Parameters:
      chunkSize - The buffer size to be used in each chunk of this queue
      maxPooledChunks - The maximum number of reused chunks kept around to avoid allocation, chunks are pre-allocated
    • MpmcUnboundedXaddArrayQueue

      public MpmcUnboundedXaddArrayQueue(int chunkSize)
  • Method Details

    • newChunk

      final MpmcUnboundedXaddChunk<E> newChunk(long index, MpmcUnboundedXaddChunk<E> prev, int chunkSize, boolean pooled)
      Specified by:
      newChunk in class MpUnboundedXaddArrayQueue<MpmcUnboundedXaddChunk<E>,E>
    • offer

      public boolean offer(E e)
      Description copied from interface: MessagePassingQueue
      Called from a producer thread subject to the restrictions appropriate to the implementation and according to the Queue.offer(Object) interface.
      Parameters:
      e - not null, will throw NPE if it is
      Returns:
      true if element was inserted into the queue, false iff full
    • poll

      public E poll()
      Description copied from interface: MessagePassingQueue
      Called from the consumer thread subject to the restrictions appropriate to the implementation and according to the Queue.poll() interface.
      Returns:
      a message from the queue if one is available, null iff empty
    • switchToNextConsumerChunkAndPoll

      private E switchToNextConsumerChunkAndPoll(MpmcUnboundedXaddChunk<E> cChunk, MpmcUnboundedXaddChunk<E> next, long expectedChunkIndex)
    • peek

      public E peek()
      Description copied from interface: MessagePassingQueue
      Called from the consumer thread subject to the restrictions appropriate to the implementation and according to the Queue.peek() interface.
      Returns:
      a message from the queue if one is available, null iff empty
    • relaxedPoll

      public E relaxedPoll()
      Description copied from interface: MessagePassingQueue
      Called from the consumer thread subject to the restrictions appropriate to the implementation. As opposed to Queue.poll() this method may return null without the queue being empty.
      Returns:
      a message from the queue if one is available, null if unable to poll
    • relaxedPeek

      public E relaxedPeek()
      Description copied from interface: MessagePassingQueue
      Called from the consumer thread subject to the restrictions appropriate to the implementation. As opposed to Queue.peek() this method may return null without the queue being empty.
      Returns:
      a message from the queue if one is available, null if unable to peek
    • fill

      public int fill(MessagePassingQueue.Supplier<E> s, int limit)
      Description copied from interface: MessagePassingQueue
      Stuff the queue with up to limit elements from the supplier. Semantically similar to:

      
         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.

      Returns:
      the number of offered elements