此操作是原子操作还是存在数据竞争的可能性?
atomicInteger.set(-atomicInteger.get());
如果存在数据竞争,如何原子地否定AtomicInteger
?
答案 0 :(得分:4)
我会这样做
public int getAndNegate(AtomicInteger i) {
for (;;) {
int current = i.get();
int next = -current;
if (i.compareAndSet(current, next))
return current;
}
}
答案 1 :(得分:1)
我猜你不需要同步来锁定实例。
AtomicInteger有很多getAndSet方法,但没有做任何反向...
显然这是在SO Does AtomicBoolean not have a negate() method?之前被问到的。该页面上的解决方案很有趣。
答案 2 :(得分:0)
public final int getAndDecrement()
原子地将当前值减1。返回先前的值
AtomicInteger itsCounter = new AtomicInteger();
itsCounter.getAndDecrement();