我想知道我是否只能在事务中获得一致的读取.以下是一些用于说明问题的代码:
(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 ×1