我想编写一段非常简单的代码,展示Clojure中commute和alter之间的不同结果。有人能为此创建一个例子吗?
更简单易懂是理解差异的最好方式。
我想编写一段非常简单的代码,展示Clojure中commute和alter之间的不同结果。有人能为此创建一个例子吗?
更简单易懂是理解差异的最好方式。
commute
被正确使用,Refs 的观察值不应有任何差异,除非在高争用的情况下使用 commute
可能有助于事务提交,而使用 alter
则难以实现。当然,在这种情况下,结果会有相当大的差异...alter
(可能仅一次)。
- 每个“事务尝试”将精确调用一次 commute
(虽然 commute
不会导致它们,但如果在同一 dosync
块中使用 alter
,则可能涉及重试),然后最后一次计算已提交的值(因此至少两次,尽管再次强调,它不会自行导致重试)。
user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil
使用一些 Thread/sleep
和一些线程,可以在仍然观察到 commute
两次重试的情况下,在 alter
方面引起更多的重试,研究使用其中一个或另一个的影响等。