在Clojure中,通勤和改变有什么区别?

时间:2016-05-25 01:44:41

标签: concurrency clojure transactions stm

我正在尝试编写非常简单的代码,它在Clojure中显示了commute和alter之间的不同结果。有人可以为此目的创建一个例子吗?

更容易理解差异。

1 个答案:

答案 0 :(得分:1)

假设commute被正确使用,Refs的观察值应该没有区别,除非使用commute可能有助于在高争用场景中提交事务很难使用alter执行此操作。当然,当这适用时,结果是一个相当显着的差异......

使用副作用更准确地说明事物的不同之处。这是一个单线程示例,用于说明

的基本属性
    每次"事务尝试"
  • alter将被调用一次(可能只有一次),

  • 每次"事务尝试"
  • commute将被调用一次(虽然commute不会导致它们,但如果在同一个alter块中使用dosync,则可能会涉及重试,然后最后一次计算已提交的值(至少如此)两次,但再次,它不会导致自己重试):

user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil

使用一些Thread/sleep和一些线程,可以在alter方面引发更多重试,同时仍然在commute侧观察两次重试,调查对Ref历史的影响使用一个或另一个等。