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
でもいいけど・・・