-
Notifications
You must be signed in to change notification settings - Fork 41
/
LifoQueue.java
58 lines (48 loc) · 1.39 KB
/
LifoQueue.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package org.davidmoten.rx.internal;
import java.util.concurrent.atomic.AtomicReference;
import io.reactivex.annotations.NonNull;
import io.reactivex.annotations.Nullable;
/**
* Thread-safe Last-In-First-Out queue. Current usage is multi-producer, single
* consumer but LIFO use case doesn't seem to offer opportunity for performance
* enhancements like the MpscLinkedQueue does for FIFO use case.
*
* @param <T> queued item type
*/
public final class LifoQueue<T> {
private final AtomicReference<Node<T>> head = new AtomicReference<>();
public void offer(@NonNull T t) {
while (true) {
Node<T> a = head.get();
Node<T> b = new Node<>(t, a);
if (head.compareAndSet(a, b)) {
return;
}
}
}
public @Nullable T poll() {
Node<T> a = head.get();
if (a == null) {
return null;
} else {
while (true) {
if (head.compareAndSet(a, a.next)) {
return a.value;
} else {
a = head.get();
}
}
}
}
public void clear() {
head.set(null);
}
static final class Node<T> {
final @NonNull T value;
final @Nullable Node<T> next;
Node(T value, Node<T> next) {
this.value = value;
this.next = next;
}
}
}