Clojure 原子和参考

Clojure 原子和参考,clojure,Clojure,根据这本书,参考文献管理共享状态的协调、同步变化,原子管理共享状态的不协调、同步变化 如果我理解正确,“协调”意味着将多个更改封装为一个原子操作。如果是这样,那么在我看来,协调只需要使用dosync调用 例如,以下两者之间的区别是什么: (def i (atom 0)) (def j (atom 0)) (dosync (swap! i inc) (swap! j dec)) 以及: 参考文献使用。。。多斯尼克!Dosync和参考文献一起工作,Dosync并不神奇,也不知道其他参考类

根据这本书,参考文献管理共享状态的协调、同步变化,原子管理共享状态的不协调、同步变化

如果我理解正确,“协调”意味着将多个更改封装为一个原子操作。如果是这样,那么在我看来,协调只需要使用dosync调用

例如,以下两者之间的区别是什么:

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

(dosync
  (swap! i inc)
  (swap! j dec))
以及:


参考文献使用。。。多斯尼克!Dosync和参考文献一起工作,Dosync并不神奇,也不知道其他参考类型或副作用

您的第一个示例相当于:

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

(do ; <--
  (swap! i inc)
  (swap! j dec))
(定义i(原子0))
(定义j(原子0))

(do;好的,我错误地认为dosync启动了一个原子代码块。谢谢你的回答。它启动了一个事务,但不能保证你放在里面的所有东西都是原子的。原子操作是alter和ref set-这些必须在事务中调用。例如,如果你在事务中执行IO,它可能会发生多次.
(def i (atom 0))
(def j (atom 0))

(do ; <--
  (swap! i inc)
  (swap! j dec))