【发布时间】:2018-10-27 22:24:14
【问题描述】:
假设我有以下一段(人为的)Clojure 代码:
(def c (clojure.lang.Atom. [nil nil]))
(swap! c
(fn [[x y]]
["done", (second (swap! c (fn [[x y]] [x y])))]))
我希望它的工作方式如下:
Clojure 将
c拆箱以找到[nil nil],并将其传递给外部fn。外部
fn调用swap!,后者将c拆箱以找到[nil nil],并将此值传递给内部fn。内部
fn返回[nil nil]。对swap!的内部调用将其替换为c的新值。外层
fn返回值["done" nil]。外层
swap!尝试compare-and-set!,发现c的当前值[nil nil]和旧值[nil nil]一样,所以成功,换入["done" nil]。
但事实上,这段代码永远循环:外层循环不断重试。
这是为什么?我的心智模型缺少什么?
【问题讨论】:
标签: concurrency clojure