Последняя часть опубликованного вами кода - != 0
. С уточняющей переменной:
int a = (int)VALUE.compareAndExchangeAcquire(this,
(expectedValue ? 1 : 0),
(newValue ? 1 : 0));
return a != 0;
Конечно, оператор !=
возвращает логическое значение.
Что касается второй части вопроса:
Кроме того, в чем разница между compareAndExchange и compareAndExchangeAcquire?
Во-первых, некоторые необходимые чтения: { ссылка }
Из приведенного выше ответа вы должны понимать, что компиляторы / процессоры могут переупорядочивать загрузки / магазины, и на них накладываются ограничения, которые приобретаются и освобождаются. Сравнение и обмен, скорее всего, реализованы с помощью инструкции CAS, которую можно рассматривать как загрузку + сохранение. compareAndExchangeAcquire
и compareAndExchangeRelease
добавляют семантику выпуска / получения в соответствующие хранилища CAS / load +. Другими словами, вы можете использовать их, чтобы предотвратить определенные переупорядочения или разрешить определенные переупорядочения.