AtomicInteger.compareAndSet返回原始值,而不是布尔值

时间:2015-11-13 01:06:12

标签: java atomic compare-and-swap atomicinteger

Java AtomicInteger提供public final boolean compareAndSet(int expect, int update)。如果返回false,我想知道比较失败时实际值是多少。这在Java中是否可行?

在.Net中,有public static int CompareExchange(ref int location1, int value, int comparand),它始终返回原始值。

2 个答案:

答案 0 :(得分:1)

public int getAndCompareAndSet(AtomicInteger ai, int expected, int update) {
  while (true) {
    int old = ai.get();
    if (old != expected) {
      return old;
    } else if (ai.compareAndSet(old, update)) {
      return old;
    }
  }
}

(这种循环是AtomicInteger上大多数操作的实现方式:get循环,做一些逻辑,尝试比较和设置。)

答案 1 :(得分:0)

API不公开这样的方法。更重要的是,Oracle实现使用sun.misc.Unsafe来执行本机CAS操作,并且该类型也不会公开它。

如果get()返回compareAndSet,则只需拨打false即可。但是,当您检查它时,AtomicInteger的实际值可能已更改。你用它做的并不多。对于Interlocked方法也是如此。你必须澄清你想用这个值做什么才能继续下去。