Treiber Stack是基于CAS实现的无锁竞争的线程安全stack,jdk8的FutureTask也通过一个简单的Treiber Stack来维护等待线程。以下是具体的Treiber Stack的java实现:
public class TreiberStack<E> {
AtomicReference<Node<E>> top = new AtomicReference<>();
/**
* 入栈
* @param item E
*/
public void push(E item) {
Node<E> newHead = new Node<E>(item);
Node<E> oldHead;
//使用CAS操作循环设置栈头,保证在多线程情况下push新节点时新节点是正确的栈头
do {
oldHead = top.get();
newHead.next = oldHead;
} while (!top.compareAndSet(oldHead, newHead));
}
/**
* 出栈
* @return E
*/
public E pop() {
Node<E> oldHead;
Node<E> newHead;
//使用CAS操作循环设置栈头,保证在多线程情况下pop的时候取到的是最头的节点
do {
oldHead = top.get();
if (oldHead == null) {
return null;
}
newHead = oldHead.next;
} while (!top.compareAndSet(oldHead, newHead));
return oldHead.item;
}
private static class Node<E> {
final E item;
Node<E> next;
Node(E item) {
this.item = item;
}
}
}