lavenderyhj
12/5/2018 - 8:34 AM

无阻塞栈CurrentStack

import java.util.concurrent.atomic.AtomicReference;

/**
 * 使用Treiber算法 Treiber算法主要用于实现Stack,基于Treiber算法实现的无阻塞的Stack
 *
 * @author feng
 * @param<E>
 */
public class CurrentStack<E> {
    AtomicReference<Node<E>> head = new AtomicReference<Node<E>>();

    /**
     * push stack
     *
     * @param item
     */
    public void push(E item) {
        Node<E> newHead = new Node<E>(item);
        Node<E> oldHead;
        do {
            oldHead = head.get();
            newHead.next = oldHead;
        } while (!head.compareAndSet(oldHead, newHead));
    }

    /**
     * pop stack
     *
     * @param item
     */
    public E poll() {
        Node<E> oldHead;
        Node<E> newHead;
        do {
            oldHead = head.get();
            newHead = oldHead.next;
        } while (!head.compareAndSet(oldHead, newHead));
        returnoldHead.item;
    }

    static class Node<E> {
        final Eitem;
        Node<E> next;

        public Node(Eitem) {
            this.item = item;
        }
    }
}