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

标签 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)
    }
}

这两种方法是否相同?

最佳答案

setcompareAndSet 方法的行为不同:

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

Does the set() method also ensure the atomic process?

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

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

关于Java 原子变量 set() 与 compareAndSet(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19238594/

相关文章:

Python:子类化 frozenset 不可迭代?

c++ - 使用 GCC 进行原子 64 位写入

c++ - 在多个线程中递减索引

Java Elasticsearch - 具有存在条件的 Boolquery

java - BPXWUNIX : not found error when trying to run Regina Rexx script

arrays - 无论索引如何,检查两个数组中的元素是否相同

javascript - 以编程方式设置 dijit NumberSpinner 值

objective-c - 为什么原子和非原子概念已从 swift 中删除

java - DynamoDB DynamoDBAutoGenerateStrategy.CREATE 不适用于 DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES

java - 如何使用 Spring 清除所有 Hibernate 缓存(ehcache)?