小编Joe*_*ann的帖子

一致读取多个refs

我想知道我是否只能在事务中获得一致的读取.以下是一些用于说明问题的代码:

(def foo (ref 0))     
(def bar (ref 0)) 
(defn incer [] (dosync (alter foo inc) (alter bar inc)))
(.start (Thread. (fn [] (last (repeatedly incer))))) ;; create a lot of action
Run Code Online (Sandbox Code Playgroud)

现在我想打印foo和bar的值

(println @foo @bar)
;=> 328498765 328498766
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用ensure获得一致的值

(dosync (ensure foo) (ensure bar) (println @foo  @bar))
;=> 356117587 356117587
Run Code Online (Sandbox Code Playgroud)

我想知道这是否是唯一的方法,或者是否有更好的解决方案.在他的演讲中"我们还在吗?" (http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey)at min 55 Rich显示了一张幻灯片,暗示有一些方法可以在不将感知置于事务中的情况下进行,但是我无法弄清楚如何.

clojure

6
推荐指数
1
解决办法
218
查看次数

标签 统计

clojure ×1