我正在试验 java.util.concurrent 并试图找出如何正确使用 AtomicReference.compareAndSet 来管理对单个共享状态单元的并发访问。
特别是:compareAndSet 的以下用法是否正确且安全?有什么陷阱吗?
我的测试类是一个基于节点链表的简单堆栈。
public class LinkedStack<T> {
AtomicReference<Node<T>> topOfStack=new AtomicReference<Node<T>>();
public T push(T e) {
while(true) {
Node<T> oldTop=topOfStack.get();
Node<T> newTop=new Node<T>(e,oldTop);
if (topOfStack.compareAndSet(oldTop, newTop)) break;
}
return e;
}
public T pop() {
while(true) {
Node<T> oldTop=topOfStack.get();
if (oldTop==null) throw new EmptyStackException();
Node<T> newTop=oldTop.next;
if (topOfStack.compareAndSet(oldTop, newTop)) return oldTop.object;
}
}
private static final class Node<T> {
final T object;
final Node<T> next;
private Node (T object, Node<T> next) {
this.object=object;
this.next=next;
}
}
...................
}
最佳答案
是的,这正是它应该如何使用。
也许下面的语法会更优雅:
Node<T> oldTop = null;
Node<T> newTop = null;
do {
oldTop=topOfStack.get();
newTop=new Node<T>(e,oldTop);
} while (!topOfStack.compareAndSet(oldTop, newTop));
关于java - 正确使用 AtomicReference.compareAndSet 实现堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5553398/