我正在学习《七周七并发模型》这本书。在书中,哲学家被表示为一些ref
。
(def philosophers (into [] (repeatedly 5 #(ref :thinking))))
每个哲学家的状态在
dosync
事务中翻转,以确保一致性,其中状态包括:thinking
和:eating
。现在我想要一个线程来输出当前状态,这样我就可以确保状态始终有效:
(defn status-thread []
(Thread.
#(while true
(dosync
(println (map (fn [p] @p) philosophers))
(Thread/sleep 100)))))
我们使用多个
@
来读取每个哲学家的值。当我们在哲学家之间进行map
时,有些引用可能会发生改变。这会导致打印不一致的状态吗?我知道Clojure使用
MVCC
来实现STM
,但我不确定是否正确应用了它。我的事务包含副作用,通常不应该出现在事务中。但在这种情况下,事务总是成功的,并且副作用只应该发生一次。这样做是否可以接受?