原子和参考文献

Sta*_*ked 4 clojure

根据编程Clojure refs管理协调,同步更改共享状态和原子管理共享状态的不协调,同步更改.

如果我理解正确"协调"意味着多个更改被封装为一个原子操作.如果是这种情况,那么在我看来,协调只需要使用dosync调用.

例如:有什么区别:

(def i (atom 0))
(def j (atom 0))

(dosync
  (swap! i inc)
  (swap! j dec))
Run Code Online (Sandbox Code Playgroud)

和:

(def i (ref 0))
(def j (ref 0))

(dosync
  (alter i inc)
  (alter j dec))
Run Code Online (Sandbox Code Playgroud)

cgr*_*and 13

使用... dosync协调参考!Dosync和refs一起工作,dosync并不神奇,对其他参考类型或副作用一无所知.

你的第一个例子相当于:

(def i (atom 0))
(def j (atom 0))

(do ; <--
  (swap! i inc)
  (swap! j dec))
Run Code Online (Sandbox Code Playgroud)