[英]What is the difference between compareAndExchange vs compareAndExchangeAcquire
這是來自 Java 庫的片段:
public final boolean compareAndExchangeAcquire(boolean expectedValue, boolean newValue) {
return (int)VALUE.compareAndExchangeAcquire(this,
(expectedValue ? 1 : 0),
(newValue ? 1 : 0)) != 0;
}
它來自AtomicBoolean
class。 轉換為int
如何返回boolean
?
我的主要問題: compareAndExchange
與compareAndExchangeAcquire
有什么區別?
通俗地說:在xxxRelease
之前和xxxAcquire
之后編寫的語句可以在應用xxx
時自由地重新排序。
您發布的代碼的最后一部分是!= 0
。 帶有澄清變量:
int a = (int)VALUE.compareAndExchangeAcquire(this,
(expectedValue ? 1 : 0),
(newValue ? 1 : 0));
return a != 0;
當然!=
運算符返回 boolean。
至於問題的第二部分:
另外, compareAndExchange 與 compareAndExchangeAcquire 有什么區別?
首先一些必讀: https://stackoverflow.com/a/16181675/3424746
從上面的答案中,您應該了解編譯器/處理器可以重新排序加載/存儲,以及獲取和釋放的限制。 比較和交換最有可能使用 CAS 指令來實現,可以將其視為加載+存儲。 compareAndExchangeAcquire
和compareAndExchangeRelease
將釋放/獲取語義添加到有問題的 CAS/加載+存儲。 換句話說,您可以使用這些來防止某些重新排序,或允許某些重新排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.