gpt4 book ai didi

java - Java 中 Atomic set() 和 getAndSet() 方法的区别

转载 作者:行者123 更新时间:2023-11-30 10:04:36 25 4
gpt4 key购买 nike

在我的一个程序中,我试图更新一个原子整数的值,但无法在 set()getAndSet() 方法之间做出决定,因为它们两者似乎都做同样的事情。我已经通过了thisthis发布,但他们正在比较 setcompareAndSet(如果线程没有预期值,则放弃设置提供的值)而我有兴趣比较 setsetAndGet(仅在设置提供的值后返回)。

   //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;
}

我无法找出这两种方法之间的任何主要区别。

  1. 为什么我们有 getAndSet() 而有 set()。可以选择不使用 getAndSet() 返回的值。

  2. 什么时候应该使用这些方法中的每一种?

最佳答案

根据java documentation ,他们都做不同的事情:

AtomicReference#getAndSet 会将内部值设置为您传入的任何值,但会返回旧值。

AtomicReference<Integer> reference = new AtomicReference<>(10);
int value = reference.getAndSet(14);
System.out.println(value); // prints 10

AtomicReference#set 将设置内部值,仅此而已。它返回无效。

AtomicReference<Integer> reference = new AtomicReference<>(10);
reference.set(15);
System.out.println(reference.get()); // prints 15;

关于java - Java 中 Atomic set() 和 getAndSet() 方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55830834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com