gpt4 book ai didi

java - 正确使用 AtomicReference.compareAndSet 实现堆栈

转载 作者:搜寻专家 更新时间:2023-11-01 01:19:01 27 4
gpt4 key购买 nike

我正在试验 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com