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 版本可能会“跳过”其他线程插入的值。
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 版本可能会“跳过”其他线程插入的值。