2015-11-07 51 views
2
(ns learnclojure.core) 

(def acct1 (atom 1000 :validator #(>= % 0))) 
(def acct2 (atom 1000 :validator #(>= % 0))) 

(defn transfer [from-ac to-ac amt] 
    (swap! to-ac + amt) 
    (swap! from-ac - amt)) 

(dotimes [_ 10] 
    (future (transfer acct2 acct1 100))) 

(deref acct1) 
(deref acct2) 


(def acct1 (ref 1000 :validator #(>= % 0))) 
(def acct2 (ref 1000 :validator #(>= % 0))) 

(defn transfer [from-ac to-ac amt] 
    (dosync 
    (alter to-ac + amt) 
    (alter from-ac - amt))) 

(dotimes [_ 10] 
    (future (transfer acct2 acct1 100))) 

(deref acct1) 
(deref acct2) 

我有兩個Clojure代碼併發改變狀態。 第一個使用原子(第3-14行)似乎工作正常,而第二個使用ref(第17行和第29行)顯示隨機結果。什麼可能是錯的?完成期貨執行前Clojure的ref與併發原子

enter image description here

回答

2

最後(deref acct1) (deref acct2)形式進行評估。

更何況,結果是不一致的,因爲讀取不協調;如果你寫的東西像(dosync [(deref acct1) (deref acct2)])總和將始終是2000

順便說一句,我強烈建議你不要重新定義#'transfer#'acct1#'acct2瓦爾對於這種併發實驗;選擇不同的名稱:)