首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicBoolean.set(标志)和AtomicBoolean.compareAndSet(!标志,标志)有什么区别?

AtomicBoolean.set(标志)和AtomicBoolean.compareAndSet(!标志,标志)有什么区别?
EN

Stack Overflow用户
提问于 2012-11-13 15:38:54
回答 5查看 6.2K关注 0票数 6

我想知道打电话是否有什么区别(或可能的副作用):

代码语言:javascript
复制
AtomicBoolean.set(true)

代码语言:javascript
复制
AtomicBoolean.compareAndset(false, true)

JavaDoc of AtomicBoolean#set声明:

无条件地设置给定的值。

AtomicBoolean#compareAndSet声明:

如果当前值==为期望值,则原子地将值设置为给定的更新值。

在这两种情况下,该值都将设置为true。那有什么区别呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-13 15:41:32

如果值已经是compareAndset(false, true),则false将返回true

它实际上相当于!getAndSet(true)

票数 10
EN

Stack Overflow用户

发布于 2012-11-13 15:45:23

您引用的文本明确地说明了这两个操作之间的区别。但是,为了更清楚地说明,如果忽略原子性方面,第一个方面相当于:

代码语言:javascript
复制
public void set(boolean newValue) {
    this.value = newValue;
}

第二项相当于:

代码语言:javascript
复制
public boolean compareAndSet(boolean expected, boolean newValue) {
    if (this.value == expected) {
        this.value = newValue;
        return true;
    } else {
        return false;
    }
}

对于您的示例,set(true)将状态设置为truecompareAndset(false, true)将状态设置为true当且仅当它不是true。因此,是的,对AtomicBoolean状态的净影响是相同的。

但是,您会注意到,根据return对象的初始状态,AtomicBoolean值不同.因此,从这个角度来看,方法是不等价的,即使是那些参数值。

票数 6
EN

Stack Overflow用户

发布于 2015-02-26 07:42:10

降落在这里,从性能的角度寻找答案。由于不确定本机实现与决策块之间的关系,我最终编写了代码来对其进行评估。根据结果,set()肯定占据了性能的上风,因为它不需要经过多个决策块。请查找下面的代码和输出。

代码语言:javascript
复制
public static void main(String[] args) {
    boolean curValue = true;
    boolean dummyValue = true;
    int attempts = Integer.MAX_VALUE;


    AtomicBoolean test = new AtomicBoolean(curValue);
    long start = System.currentTimeMillis();
    for(int i=0; i<attempts; i++){
        test.set(true);
        dummyValue = !dummyValue;
    }
    System.out.println("time taken for set: "+(System.currentTimeMillis()-start));

    start = System.currentTimeMillis();
    for(int i=0; i<attempts; i++){
        test.compareAndSet(curValue, curValue); // always set the same value
        dummyValue = !dummyValue;
    }
    System.out.println("time taken for compareAndSet - same value case: "+(System.currentTimeMillis()-start));

    curValue = !curValue;
    start = System.currentTimeMillis();
    for(int i=0; i<attempts; i++){
        test.compareAndSet(curValue, !curValue); // always invert
        curValue = !curValue;
    }
    System.out.println("time taken for compareAndSet - inversion case: "+(System.currentTimeMillis()-start));
}

输出:

代码语言:javascript
复制
time taken for set: 2689
time taken for compareAndSet - same value case: 15559
time taken for compareAndSet - inversion case: 14802
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13363752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档