Java AtomicReference#getAndSet的用例是什么?

问题描述

Java atomicreference#getAndSet的用例是什么?换句话说,是否正确的假设是:如果我在代码中使用的atomicreference中唯一的方法atomicreference#getAndSet,那么我根本不需要atomicreference,只需{{ 1}}变量就够了吗?

例如,如果我有一个代码

volatile

,不是总是和

完全一样吗?
private final atomicreference<String> string = new atomicreference<>("old");

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

从呼叫者的角度来看?

解决方法

不,这些不是等效的。区别在于getAndSet原子地执行两个操作,而不仅仅是原子获取,然后是原子集。

始终保证

getAndSet准确地返回 在设置新值之前存储在参考 中的值。易失性版本可能会“跳过”其他线程插入的值。