This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
Тогда уже и это надо постить https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Volatile.java
Если валидатора и наблюдателей нет, это дёшево, но всё равно несколько лишних вызовов функций.
@maxp volatile просто атомарная ссылка, т.е. ты как нитка исполнения её не увидишь в промежуточном состоянии (там всекие мемори барьеры кэши и регистры многопроцессорные делают это возможным), а атом тебе позволяет транзакционно применить лямбду используя swap для изменения значения ссылки (возможно выполняя ее несколько раз в условиях гонки до победного конца) там спинлок используется для этого. Ну и валидаторы с оповещениями, которые можно использовать для io по результатам транзакции. А так, io внутри swap запрещён, поскольку может несколько раз исполняться.
Кстати, теоретически можно создать ситуацию, когда swap не выполняться никогда, если его всегда будет опережать другой более быстрый swap.
В общем volatile тебя ни от каких race conditions не спасёт, а atom - примитив синхронизации позволяющий тебе об этом практически не думать.
Volatile можно рассматривать просто как один из способов сохранять mutable state, говорят, что оно быстрее, чем atom именно потому, что нет лишней синхронизации
его хорошо использовать в безопасных местах, где нужна мутабельность и минимальные накладки