AtomicBoolean.set(flag)和AtomicBoolean.compareAndSet(!flag,flag)有什么区别?

ejb*_*boy 4 java java.util.concurrent compare-and-swap

我想知道在调用之间是否存在任何差异(或可能的副作用):

AtomicBoolean.set(true)
Run Code Online (Sandbox Code Playgroud)

AtomicBoolean.compareAndset(false, true)
Run Code Online (Sandbox Code Playgroud)

JavaDoc AtomicBoolean#set状态:

无条件地设置为给定值.

虽然AtomicBoolean#compareAndSet状态:

如果当前值==期望值,则以原子方式将值设置为给定的更新值.

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

SLa*_*aks 9

compareAndset(false, true)false如果值已经返回true.
它实际上相当于!getAndSet(true).

  • 这是真的;)但我认为值得一提的是compareAndSet调用本机操作compareAndSwapInt.因此,在调用者对先前值不感兴趣的情况下,`set`应该是更好的选择.感谢您的回答! (2认同)

Ste*_*n C 6

那么你引用的文字明确说明了这两个操作之间的区别.但为了更清楚,如果忽略原子性方面,第一个相当于:

public void set(boolean newValue) {
    this.value = newValue;
}
Run Code Online (Sandbox Code Playgroud)

第二个相当于:

public boolean compareAndSet(boolean expected, boolean newValue) {
    if (this.value == expected) {
        this.value = newValue;
        return true;
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于您的示例,set(true)将状态设置为true,并将compareAndset(false, true)状态设置为trueiff它尚未存在true.所以,是的,对状态的净影响AtomicBoolean是相同的.

但是,您会注意到return值的大小取决于AtomicBoolean对象的初始状态...因此从该角度来看,即使使用这些参数值,方法也不相同.