簡體   English   中英

compareAndExchange 與 compareAndExchangeAcquire 有什么區別

[英]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

我的主要問題: compareAndExchangecompareAndExchangeAcquire有什么區別?


通俗地說:在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 指令來實現,可以將其視為加載+存儲。 compareAndExchangeAcquirecompareAndExchangeRelease將釋放/獲取語義添加到有問題的 CAS/加載+存儲。 換句話說,您可以使用這些來防止某些重新排序,或允許某些重新排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM