Class SpscAtomicArrayQueue<E>

  • All Implemented Interfaces:
    java.lang.Iterable<E>, java.util.Collection<E>, java.util.Queue<E>, IndexedQueueSizeUtil.IndexedQueue, MessagePassingQueue<E>, QueueProgressIndicators, SupportsIterator

    public class SpscAtomicArrayQueue<E>
    extends SpscAtomicArrayQueueL3Pad<E>
    NOTE: This class was automatically generated by org.jctools.queues.atomic.JavaParsingAtomicArrayQueueGenerator which can found in the jctools-build module. The original source file is SpscArrayQueue.java. A Single-Producer-Single-Consumer queue backed by a pre-allocated buffer.

    This implementation is a mashup of the Fast Flow algorithm with an optimization of the offer method taken from the BQueue algorithm (a variation on Fast Flow), and adjusted to comply with Queue.offer semantics with regards to capacity.
    For convenience the relevant papers are available in the `resources` folder:
    2010 - Pisa - SPSC Queues on Shared Cache Multi-Core Systems.pdf
    2012 - Junchang- BQueue- Ef?cient and Practical Queuing.pdf
    This implementation is wait free.

    • Constructor Detail

      • SpscAtomicArrayQueue

        public SpscAtomicArrayQueue​(int capacity)
    • Method Detail

      • offer

        public 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.

        This implementation is correct for single producer thread use only.

        Parameters:
        e - not null, will throw NPE if it is
        Returns:
        true if element was inserted into the queue, false iff full
      • offerSlowPath

        private boolean offerSlowPath​(java.util.concurrent.atomic.AtomicReferenceArray<E> buffer,
                                      int mask,
                                      long producerIndex)
      • poll

        public E poll()
        Called from the consumer thread subject to the restrictions appropriate to the implementation and according to the Queue.poll() interface.

        This implementation is correct for single consumer thread use only.

        Returns:
        a message from the queue if one is available, null iff empty
      • peek

        public E peek()
        Called from the consumer thread subject to the restrictions appropriate to the implementation and according to the Queue.peek() interface.

        This implementation is correct for single consumer thread use only.

        Returns:
        a message from the queue if one is available, null iff empty
      • relaxedOffer

        public boolean relaxedOffer​(E message)
        Description copied from interface: MessagePassingQueue
        Called from a producer thread subject to the restrictions appropriate to the implementation. As opposed to Queue.offer(Object) this method may return false without the queue being full.
        Parameters:
        message - not null, will throw NPE if it is
        Returns:
        true if element was inserted into the queue, false if unable to offer
      • 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
      • drain

        public int drain​(MessagePassingQueue.Consumer<E> c)
        Description copied from interface: MessagePassingQueue
        Remove all available item from the queue and hand to consume. This should be semantically similar to:
         M m;
         while((m = relaxedPoll()) != null){
         c.accept(m);
         }
         
        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.

        Returns:
        the number of polled elements
      • fill

        public int fill​(MessagePassingQueue.Supplier<E> s)
        Description copied from interface: MessagePassingQueue
        Stuff the queue with elements from the supplier. Semantically similar to:
         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.

        Returns:
        the number of offered elements
      • drain

        public int drain​(MessagePassingQueue.Consumer<E> c,
                         int limit)
        Description copied from interface: MessagePassingQueue
        Remove up to limit elements from the queue and hand to consume. This should be semantically similar to:

        
           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.

        Returns:
        the number of polled elements
      • 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