Concurrency Clojure';s ref与并发中的atom
我有两个Clojure代码同时更改状态。 第一个使用atom的(第3-14行)似乎运行良好,而第二个使用ref的(第17和29行)显示随机结果。可能有什么问题 在期货交易完成之前,对最后的Concurrency Clojure';s ref与并发中的atom,concurrency,clojure,Concurrency,Clojure,我有两个Clojure代码同时更改状态。 第一个使用atom的(第3-14行)似乎运行良好,而第二个使用ref的(第17和29行)显示随机结果。可能有什么问题 在期货交易完成之前,对最后的(deref acct1)(deref acct2)表格进行评估 而且,由于读取不协调,结果不一致;如果您编写了类似于(dosync[(deref acct1)(deref acct2)]的代码,那么总数将始终是2000 顺便说一下,我强烈建议您不要为这种并发性实验重新定义#transfer、#acct1和#a
(deref acct1)(deref acct2)
表格进行评估
而且,由于读取不协调,结果不一致;如果您编写了类似于(dosync[(deref acct1)(deref acct2)]
的代码,那么总数将始终是2000
顺便说一下,我强烈建议您不要为这种并发性实验重新定义#transfer
、#acct1
和#acct2
变量;选择不同的名称:)
(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)