В чем разница между compareAndExchange и compareAndExchangeAcquire - PullRequest
0 голосов
/ 13 июля 2020

Вот фрагмент из библиотеки Java:

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

Это из класса AtomicBoolean. Как приведение к int может вернуть boolean?

Мой главный вопрос: в чем разница между compareAndExchange и compareAndExchangeAcquire?

С точки зрения непрофессионала: заявления, написанные до xxxAcquire и после xxxRelease, можно изменить при подаче заявки xxx.

введите описание изображения здесь

1 Ответ

5 голосов
/ 13 июля 2020

Последняя часть опубликованного вами кода - != 0. С уточняющей переменной:

int a = (int)VALUE.compareAndExchangeAcquire(this,
                                                (expectedValue ? 1 : 0),
                                                (newValue ? 1 : 0));
return a != 0;

Конечно, оператор != возвращает логическое значение.

Что касается второй части вопроса:

Кроме того, в чем разница между compareAndExchange и compareAndExchangeAcquire?

Во-первых, некоторые необходимые чтения: { ссылка }

Из приведенного выше ответа вы должны понимать, что компиляторы / процессоры могут переупорядочивать загрузки / магазины, и на них накладываются ограничения, которые приобретаются и освобождаются. Сравнение и обмен, скорее всего, реализованы с помощью инструкции CAS, которую можно рассматривать как загрузку + сохранение. compareAndExchangeAcquire и compareAndExchangeRelease добавляют семантику выпуска / получения в соответствующие хранилища CAS / load +. Другими словами, вы можете использовать их, чтобы предотвратить определенные переупорядочения или разрешить определенные переупорядочения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...