Java AtomicReference#getAndSet 的用例是什么?

What is a usecase for Java AtomicReference#getAndSet?

JavaAtomicReference#getAndSet的用例是什么?换句话说,如果我在我的代码中使用 AtomicReference 的唯一方法是 AtomicReference#getAndSet,那么我根本不需要 AtomicReference,只是一个 volatile 变量就够了吗?

例如,如果我有下一个代码:

private final AtomicReference<String> string = new AtomicReference<>("old");

public String getAndSet() {
    return string.getAndSet("new");
}

,是不是总是和

做的一模一样
private volatile String string = "old";

public String getAndSet() {
    String old = string;
    string = "new";
    return old;
}

从来电者的角度来看?

不,这些不等同。不同之处在于 getAndSet 以原子方式执行 两个操作 ,而不仅仅是原子获取然后是原子设置。

getAndSet 始终保证 return 恰好 存储在引用中的值 就在 之前新值已设置。 volatile 版本可能会“跳过”其他线程插入的值。