Неблокирующий стек с AtomicReference
От: trupanka  
Дата: 04.03.12 18:52
Оценка:
По ссылке http://www.ibm.com/developerworks/ru/library/j-jtp04186/ есть учебный пример реализации неблокирующего стека при помощи AtomicReference:

Листинг 3. Неблокирующий стек, использующий алгоритм Трайбера (Treiber)

public class ConcurrentStack<E> {
    AtomicReference<Node<E>> head = new AtomicReference<Node<E>>();

    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));
    }

    public E pop() {
        Node<E> oldHead;
        Node<E> newHead;
        do {
            oldHead = head.get();
            if (oldHead == null) 
                return null;
            newHead = oldHead.next;
        } while (!head.compareAndSet(oldHead,newHead));
        return oldHead.item;
    }

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

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


Возник вопрос по поводу куска кода в методе pop
if (oldHead == null) return null;


Разве после проверки условия и до возвращения из метода в стек не могут положить новый объект?
Понимаю, что пример учебный, но хочется разобраться. Есть ли ошибка в данном листинге? Где можно почитать про этот алгоритм (алгоритм Трайбера)? Является ли это ошибкой в реализации или допущением?
Помогите, пожалуйста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.