首页 > 解决方案 > Java AtomicReference#getAndSet 的用例是什么?

问题描述

Java 的用例是什么AtomicReference#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;
}

从调用者的角度来看?

标签: javaconcurrencyvolatileatomicreference

解决方案


不,这些不是等价的。不同之处在于getAndSet两种操作都是原子的,而不仅仅是一个原子的 get 和一个原子的 set。

getAndSet始终保证在设置新值之前准确返回存储在引用中的值。volatile 版本可能会“跳过”其他线程插入的值。


推荐阅读