8

我想知道原子类中 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)
    }
}

这两种方法是否相同?

4

2 回答 2

8

set和方法的compareAndSet作用不同:

  • compareAndSet :如果当前值等于(==)预期值,则自动将值设置为给定的更新值。
  • set :设置为给定值。

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

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

public final void set(long newValue) {
        value = newValue;
}
于 2013-10-08T03:48:44.290 回答
-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

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

于 2013-10-08T03:34:23.170 回答