compareAndExchange 与 compareAndExchangeAcquire 有什么区别

Con*_*hai 0 java concurrency java-14

这是 Java 库中的一个片段:

public final boolean compareAndExchangeAcquire(boolean expectedValue, boolean newValue) {
    return (int)VALUE.compareAndExchangeAcquire(this,
                                                (expectedValue ? 1 : 0),
                                                (newValue ? 1 : 0)) != 0;
}
Run Code Online (Sandbox Code Playgroud)

它来自AtomicBoolean课堂。演员怎么能int返回一个boolean

我的主要问题:compareAndExchangevs之间有什么区别compareAndExchangeAcquire


通俗地说:在申请之前xxxAcquire和之后写的语句xxxRelease可以自由重新排序xxx

在此处输入图片说明

PiR*_*cks 5

您发布的代码的最后一部分是!= 0. 随着澄清变量:

int a = (int)VALUE.compareAndExchangeAcquire(this,
                                                (expectedValue ? 1 : 0),
                                                (newValue ? 1 : 0));
return a != 0;
Run Code Online (Sandbox Code Playgroud)

当然,!=运算符返回一个布尔值。

至于问题的第二部分:

另外,compareAndExchange 与 compareAndExchangeAcquire 之间有什么区别?

首先是一些必读的内容:https : //stackoverflow.com/a/16181675/3424746

从上面的答案你应该明白编译器/处理器可以重新排序加载/存储,以及获取和释放的限制。比较和交换最有可能通过 CAS 指令实现,可以将其视为加载 + 存储。compareAndExchangeAcquirecompareAndExchangeRelease释放/获取语义添加到CAS /负载+存储问题。换句话说,您可以使用这些来防止某些重新排序,或允许某些重新排序。