Clojure 1.7からVolatileを扱うための関数volatile!, vswap!, vreset!, volatile?が導入されました。
Volatileはtransducersの実行性能を上げるために導入した、アトミック性をなくしたAtomのようなもののようです。
使い方もAtomと似てます。
volatile-sample.clj
(def v (volatile! {:a 1}))
(vswap! v assoc :b 2)
(vreset! v {:c 3})
実装としてはJavaのvolatileそのものです。なのでderefやvreset!はアトミック操作になりますが、vswap!は違うので複数スレッドから同時にvswap!するのはダメです。
Javaのvolatileも使いどころが難しいので、Clojureでも有効に使うのは難しいかもしれません。
スレッドローカルなところでお手軽なミュータブル変数としては使えるかもしれないです。
※ローカルならwith-local-varsでもいいけど・・・