Compareandexchange () против Compareandset () Atomi c -Integer - PullRequest
0 голосов
/ 12 марта 2020

Работая над AtomicInteger, я обнаружил, что этот API предоставляет два метода:

compareAndExchange :

Атомно устанавливает значение в newValue, если текущее значение, упоминается как значение свидетеля, == Ожидаемое значение, с эффектами памяти, определенными как VarHandle.compareAndExchange(java.lang.Object...)

compareAndSet :

Атомно устанавливает значение до newValue, если текущий value == expectedValue, с эффектами памяти, указанными в VarHandle.compareAndSet(java.lang.Object...).

Я не могу понять разницу между двумя, Пожалуйста, помогите с подходящим примером.

1 Ответ

1 голос
/ 12 марта 2020

Два метода имеют разные типы возвращаемых значений.

compareAndSet возвращает boolean:

true в случае успеха. Ложный возврат означает, что фактическое значение не было равно ожидаемому.

compareAndExchange возвращает int:

значение свидетеля, которое будет то же самое, что и ожидаемое значение в случае успеха

, т.е. compareAndSet указывает, было ли обновлено значение переменной, а compareAndExchange возвращает текущее значение переменной, что дает вам больше информации.

compareAndSet(1,2) установит значение атома c integer равным 2, если предыдущее значение было 1, и вернет true в этом случае. В противном случае он не установит значение и вернет false.

compareAndExchange​(1,2) установит значение целого атома c равным 2, если предыдущее значение было 1, и вернет 1 в этом случае. Если предыдущее значение не было 1, оно не установит значение и вернет текущее (неизменное) значение.

...