Package rx.internal.util.unsafe
Class SpscLinkedQueue<E>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractQueue<E>
rx.internal.util.unsafe.BaseLinkedQueuePad0<E>
rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef<E>
rx.internal.util.unsafe.BaseLinkedQueuePad1<E>
rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef<E>
rx.internal.util.unsafe.BaseLinkedQueue<E>
rx.internal.util.unsafe.SpscLinkedQueue<E>
- Type Parameters:
E
-
- All Implemented Interfaces:
Iterable<E>
,Collection<E>
,Queue<E>
This is a weakened version of the MPSC algorithm as presented on 1024
Cores by D. Vyukov. The original has been adapted to Java and it's quirks with regards to memory model and
layout:
- Use inheritance to ensure no false sharing occurs between producer/consumer node reference fields.
- As this is an SPSC we have no need for XCHG, an ordered store is enough.
-
Field Summary
Fields inherited from class rx.internal.util.unsafe.BaseLinkedQueue
p00, p01, p02, p03, p04, p05, p06, p07, p30, p31, p32, p33, p34, p35, p36, p37
Fields inherited from class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef
C_NODE_OFFSET, consumerNode
Fields inherited from class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef
P_NODE_OFFSET, producerNode
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionboolean
IMPLEMENTATION NOTES:
Offer is allowed from a SINGLE thread.
Offer allocates a new node (holding the offered value) and: Sets that node as the producerNode.next Sets the new node as the producerNode From this follows that producerNode.next is always null and for all other nodes node.next is not null.peek()
poll()
IMPLEMENTATION NOTES:
Poll is allowed from a SINGLE thread.
Poll reads the next node from the consumerNode and: If it is null, the queue is empty.Methods inherited from class rx.internal.util.unsafe.BaseLinkedQueue
isEmpty, iterator, size
Methods inherited from class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef
lpConsumerNode, lvConsumerNode, spConsumerNode
Methods inherited from class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef
lpProducerNode, lvProducerNode, spProducerNode
Methods inherited from class java.util.AbstractCollection
contains, containsAll, remove, removeAll, retainAll, toArray, toArray, toString
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface java.util.Collection
contains, containsAll, equals, hashCode, parallelStream, remove, removeAll, removeIf, retainAll, spliterator, stream, toArray, toArray, toArray
-
Constructor Details
-
SpscLinkedQueue
public SpscLinkedQueue()
-
-
Method Details
-
offer
IMPLEMENTATION NOTES:
Offer is allowed from a SINGLE thread.
Offer allocates a new node (holding the offered value) and:- Sets that node as the producerNode.next
- Sets the new node as the producerNode
- See Also:
-
poll
IMPLEMENTATION NOTES:
Poll is allowed from a SINGLE thread.
Poll reads the next node from the consumerNode and:- If it is null, the queue is empty.
- If it is not null set it as the consumer node and return it's now evacuated value.
-
peek
-