CompareAndSet和IncrementAndGet之间的真正区别是什么?

时间:2017-10-23 22:25:19

标签: java concurrency parallel-processing

我正在尝试了解使用原子变量时CAS (CompareAndSet)IncrementAndGet之间的真正区别。我知道CAS是一种非阻塞方法,允许多个线程尝试乐观地更改变量。如果失败,它会再次尝试。我不明白为什么要使用IncrementAndGet?除了可以用CASCAS(235, 300)之外,似乎它具有相同的基本功能,其中IncrementAndGet只能在当前值中添加一个,而CAS可以拥有它想要在期望值参数内。

谢谢!

2 个答案:

答案 0 :(得分:1)

incrementAndGet不一定是CAS的并行指令。它是在原生CAS功能之上构建的构造。看看source code *,了解其工作原理:

/**
 * Atomically increments by one the current value.
 *
 * @return the updated value
 */
public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

*我为了简单起见使用Java 7版本,但Java 8也是一样的想法。

答案 1 :(得分:1)

  

CompareAndSet和IncrementAndGet之间的真正区别是什么?

不同之处在于他们做了不同的事情。从您的问题中的描述可以清楚地看出这一点。甚至是方法的名称:

  • 一个是有条件的,另一个是无条件的
  • 一个是设定操作,另一个是增量操作。
  

我不明白为什么使用它可以使用IncrementAndGet?

例如,如果您只想增加原子序数,就可以使用它。这相当于......

{{1}}

...如果Java中存在真正的原子基元类型。 (没有。)