2010-05-15 77 views
4

根据书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)) 

回答

13

参考文献使用协调... dosync!同步和参考一起工作,dosync不是神奇的,并且对其他参考类型或副作用一无所知。

你的第一个例子是等价于:

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

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

好吧,我误以为dosync启动的原子代码块。感谢你的回答。 – StackedCrooked 2010-05-15 10:35:22

+1

它开始一个交易,但并不保证你放入它的所有东西都是原子的。原子操作是改变和重新设置 - 我必须在事务中调用这些操作。例如,如果你在一个事务中做IO,它可能会发生多次。 – Zak 2010-05-15 13:39:41