compareAndSet与incrementAndGet

时间:2011-05-21 16:26:31

标签: java concurrency

开设并发编程课程。

作为一个例子,我们有

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?

由于

4 个答案:

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