LoginSignup
0
0

More than 5 years have passed since last update.

Clojure1.7から入ったvolatile!とは?

Posted at

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そのものです。なのでderefvreset!はアトミック操作になりますが、vswap!は違うので複数スレッドから同時にvswap!するのはダメです。

Javaのvolatileも使いどころが難しいので、Clojureでも有効に使うのは難しいかもしれません。
スレッドローカルなところでお手軽なミュータブル変数としては使えるかもしれないです。
※ローカルならwith-local-varsでもいいけど・・・

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0