Class BaseLinkedAtomicQueue<E>

  • All Implemented Interfaces:
    java.lang.Iterable<E>, java.util.Collection<E>, java.util.Queue<E>
    Direct Known Subclasses:
    MpscLinkedAtomicQueue, SpscLinkedAtomicQueue

    abstract class BaseLinkedAtomicQueue<E>
    extends java.util.AbstractQueue<E>
    • Field Detail

      • producerNode

        private final java.util.concurrent.atomic.AtomicReference<LinkedQueueNode<E>> producerNode
      • consumerNode

        private final java.util.concurrent.atomic.AtomicReference<LinkedQueueNode<E>> consumerNode
    • Constructor Detail

      • BaseLinkedAtomicQueue

        public BaseLinkedAtomicQueue()
    • Method Detail

      • spProducerNode

        protected final void spProducerNode​(LinkedQueueNode<E> node)
      • spConsumerNode

        protected final void spConsumerNode​(LinkedQueueNode<E> node)
      • iterator

        public final java.util.Iterator<E> iterator()
        Specified by:
        iterator in interface java.util.Collection<E>
        Specified by:
        iterator in interface java.lang.Iterable<E>
        Specified by:
        iterator in class java.util.AbstractCollection<E>
      • size

        public final int size()

        IMPLEMENTATION NOTES:
        This is an O(n) operation as we run through all the nodes and count them.

        Specified by:
        size in interface java.util.Collection<E>
        Specified by:
        size in class java.util.AbstractCollection<E>
        See Also:
        Collection.size()
      • isEmpty

        public final boolean isEmpty()

        IMPLEMENTATION NOTES:
        Queue is empty when producerNode is the same as consumerNode. An alternative implementation would be to observe the producerNode.value is null, which also means an empty queue because only the consumerNode.value is allowed to be null.

        Specified by:
        isEmpty in interface java.util.Collection<E>
        Overrides:
        isEmpty in class java.util.AbstractCollection<E>