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

Chr*_*ika 7 java atomic set 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法是否相同?

Deb*_*kia 8

setcompareAndSet方法采取不同的:

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

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

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

public final void set(long newValue) {
        value = newValue;
}
Run Code Online (Sandbox Code Playgroud)

  • 你确定`Atomic`类是原子的,因为它们使用volatile变量来维持它们的内部状态.如果你定义一个volatile变量`volatile long value`,像`value ++`这样的操作是原子的吗?答案是否定的.这个操作不是原子的; 它实际上是三个不同的操作 - 获取值,向其中添加一个值,然后将更新后的值写回.同时,另一个线程可以改变"值".所以有一个`volatile`变量并不能保证原子性.如果操作/进程提供对原子更新的支持,则它是"原子". (3认同)
  • 现在,“ set”操作是原子的,因为它只有一个操作:“ value = newValue;”,即使没有定义“ volatile”,它也是原子的。在这里,“值”被定义为“易失性”,以使用它们提供的可见性保证-一个线程所做的更改始终对其他线程可见。 (2认同)