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