开设并发编程课程。
作为一个例子,我们有
final class Counter {
private AtomicInteger value;
public long getValue() {
return value.get();
}
public long increment() {
int v;
do {
v = value.get();
}
while(!value.compareAndSet(v, v+1));
return v+1;
}
}
为什么在这种情况下你会使用compareAndSet而不是incrementAndGet?
由于
答案 0 :(得分:4)
这里是我在我的机器上的JDK版本中AtomicInteger.incrementAndGet()
方法的实现:
/**
* 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;
}
}
如您所见,实施与您的实施非常相似。
PS:为什么要两次计算v+1
?
答案 1 :(得分:3)
来自Java文档,
compareAndSet:
以原子方式将值设置为给定值 如果当前值==,则更新值 期望值。
public final boolean compareAndSet(V expect,
V update)
incrementAndGet:
以原子方式递增1 当前价值。
public final int incrementAndGet()
答案 2 :(得分:1)
由于compareAndSet基本上做同样的事情,我无法想到使用这种手写增量实现的单一理由。
答案 3 :(得分:0)
在您的情况下,类计数器以它自己的方式实现值增量,而JDK AtomicInteger.incrementAndGet()
也以它自己的方式实现它。但他们也使用CAS方法compareAndSet(V expect ,V newValue)
所以这两种实现没有区别。两种方式之间的微小差异是流通形式。 BTW,两次回答计算v + 1。
while(!value.compareAndSet(v, v+1));----v+1 is the parameter for function , and realize value to add 1;
return v+1; v+1 is the return value;