根据书籍Programming Clojure refs管理对共享状态和原子的协调,同步更改,管理对共享状态的不协调的同步更改。
如果我理解正确“协调”意味着多个更改被封装为一个原子操作。如果是这种情况,那么在我看来,协调只需要使用dosync调用。
例如:
之间有什么区别?(def i (atom 0))
(def j (atom 0))
(dosync
(swap! i inc)
(swap! j dec))
和
(def i (ref 0))
(def j (ref 0))
(dosync
(alter i inc)
(alter j dec))
答案 0 :(得分:13)
使用... dosync协调参考! Dosync和refs一起工作,dosync并不神奇,对其他参考类型或副作用一无所知。
你的第一个例子相当于:
(def i (atom 0))
(def j (atom 0))
(do ; <--
(swap! i inc)
(swap! j dec))