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