Java原子变量set()vs compareAndSet()

时间:2013-10-08 03:30:07

标签: java set atomic compare-and-swap

我想知道原子类中set()和compareAndSet()之间的区别。 set()方法是否也确保原子过程?例如这段代码:

public class sampleAtomic{
    private static AtomicLong id = new AtomicLong(0);

    public void setWithSet(long newValue){
        id.set(newValue);
    }

    public void setWithCompareAndSet(long newValue){
        long oldVal;
        do{
            oldVal = id.get();
        }
        while(!id.compareAndGet(oldVal,newValue)
    }
}

这两种方法是否相同?

2 个答案:

答案 0 :(得分:8)

setcompareAndSet方法的行为不同:

  • compareAndSet:如果当前值等于(==)到预期值,则以原子方式将值设置为给定的更新值。
  • set:设置为给定值。
  

set()方法是否也确保原子进程?

是。它是原子的。因为set新值只涉及一个操作。以下是set方法的源代码:

public final void set(long newValue) {
        value = newValue;
}

答案 1 :(得分:-1)

正如您从下面的开放式jdk代码中看到的那样。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.set%28long%29

set只是分配值而compareAndSet正在执行额外操作以确保原子性。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.compareAndSet%28long%2Clong%29

设计任何原子操作时需要考虑返回值(布尔值)。