我正在编写一些Clojure代码,它将获取到一个map的ref并对其中的key-value对进行递增操作。我认为我的ref使用正确,但是对于atom我不太确定。我需要使用swap!来更符合惯用语吗?我对STM和Clojure都很新手,这个代码看起来线程安全和正常吗?我漏掉了什么?
(defn increment-key [ref key]
(dosync
(if (= (get @ref key) nil)
(alter ref assoc key (atom 1))
(alter ref assoc key (atom (inc @(get @ref key)))))))
(defn -main [& args]
(def my-map (ref {}))
(increment-key my-map "yellow")
(println my-map)
(increment-key my-map "yellow")
(println my-map))
打印
$ lein run
#<Ref@494eaec9: {yellow #<Atom@191410e5: 1>}>
#<Ref@494eaec9: {yellow #<Atom@7461373f: 2>}>