【发布时间】:2017-12-23 05:28:18
【问题描述】:
(def a (ref 0))
(def b (ref 0))
(def f1 (future
(dosync
(println "f1 start")
(alter a inc)
(Thread/sleep 500)
(alter b inc)
(println "f1 end"))))
(def f2 (future
(dosync
(println "f2 start")
(alter a inc)
(println "f2 end"))))
@f1 @f2
在上面的例子中,我认为线程 f2 应该在 f1 之前终止,虽然 f1 在 f2 之前到达表达式 (alter a inc),但是 f1 继续其耗时的执行,所以 f2 先提交,因此,在f1 的委托,发现 ref a 已经被修改,那么 f1 应该重试。 但结果显示我错了,它打印出以下内容:
f1 start
f2 start
f2 start
f2 start
f2 start
f2 start
f1 end
f2 start
f2 end
重试的是 f2,似乎 f1 “锁定”了(更改 a inc)上的引用,并且 f2 等待 f1 “释放锁定”,然后 f2 才能成功提交更改。 底层机制是什么?
【问题讨论】:
标签: concurrency clojure