package vn.edu.rmit.sadi;
import java.util.concurrent.atomic.AtomicReference;
public class NonblockingStack<T> {
AtomicReference<Node<T>> head = new AtomicReference<Node<T>>();
public void push(T item) {
Node<T> newHead = new Node<T>(item);
Node<T> oldHead;
do {
oldHead = head.get();
newHead.next = oldHead;
} while (!head.compareAndSet(oldHead, newHead));
}
public T pop() {
Node<T> oldHead;
Node<T> newHead;
do {
oldHead = head.get();
if (oldHead == null) {
return null;
}
newHead = oldHead.next;
} while (!head.compareAndSet(oldHead,newHead));
return oldHead.value;
}
}