2010-05-15 69 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