在我的一个程序中,我试图更新Atomic Integer的值,但无法在set()
和getAndSet()
方法之间进行选择,因为它们似乎都在执行相同的操作。我已经看过this和this的帖子,但是他们正在比较set
和compareAndSet
(如果线程没有线程,则放弃设置提供的值)。期望值),而我有兴趣将set
与setAndGet
(仅在设置了提供的值后返回才返回)。
//Sets the newValue to the volatile member value
public final void set(int newValue) {
value = newValue;
}
和
public final int getAndSet(int newValue) {
return unsafe.getAndSetInt(this, valueOffset, newValue);
}
//Doesn't give up until it sets the updated value. So eventually overwrites the latest value.
public final int getAndSetInt(Object paramObject, long paramLong, int paramInt) {
int i;
do {
i = getIntVolatile(paramObject, paramLong);
} while (!compareAndSwapInt(paramObject, paramLong, i, paramInt));
return i;
}
我无法发现这两种方法之间的主要区别。
当我们拥有set()
时为什么拥有getAndSet()
。可以选择不使用getAndSet()
返回的值。
何时应使用这些方法中的每一种?
答案 0 :(得分:1)
根据java documentation,他们俩都做不同的事情:
AtomicReference#getAndSet
会将内部值设置为您传入的任何值,但将返回旧值。
AtomicReference<Integer> reference = new AtomicReference<>(10);
int value = reference.getAndSet(14);
System.out.println(value); // prints 10
AtomicReference#set
将设置内部值,仅此而已。它返回void。
AtomicReference<Integer> reference = new AtomicReference<>(10);
reference.set(15);
System.out.println(reference.get()); // prints 15;