AtomicInteger的嵌套方法调用在java中也是原子的

时间:2013-10-06 03:14:35

标签: java multithreading atomicity java-5

此操作是原子操作还是存在数据竞争的可能性?

atomicInteger.set(-atomicInteger.get());

如果存在数据竞争,如何原子地否定AtomicInteger

3 个答案:

答案 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();