Concurrency 在Clojure,通勤和改变有什么区别?
我试图编写非常简单的代码,在Clojure中显示通勤和改变之间的不同结果。有人能为这一目的创建一个例子吗Concurrency 在Clojure,通勤和改变有什么区别?,concurrency,clojure,transactions,stm,Concurrency,Clojure,Transactions,Stm,我试图编写非常简单的代码,在Clojure中显示通勤和改变之间的不同结果。有人能为这一目的创建一个例子吗 理解差异越简单越好。假设正确使用了通勤,则REF的观察值应该没有差异,除非使用通勤可能有助于事务在高争用情况下提交,而在这种情况下,使用alter很难做到这一点。当然,当这适用时,结果会有相当大的差异 使用副作用更容易准确地说明事物的不同之处。这里有一个单线程示例来说明 alter将在每次“事务尝试”中准确调用一次(可能仅调用一次) comment将在每次“事务尝试”中准确调用一次(虽然c
理解差异越简单越好。假设正确使用了
通勤
,则REF的观察值应该没有差异,除非使用通勤
可能有助于事务在高争用情况下提交,而在这种情况下,使用alter
很难做到这一点。当然,当这适用时,结果会有相当大的差异
使用副作用更容易准确地说明事物的不同之处。这里有一个单线程示例来说明
将在每次“事务尝试”中准确调用一次(可能仅调用一次)alter
将在每次“事务尝试”中准确调用一次(虽然comment
不会导致它们,但如果在同一comment
块中使用dosync
,则可能涉及重试),然后最后一次计算提交的值(因此,至少两次,尽管如此,它本身不会导致重试):alter
使用一些
Thread/sleep
s和少量线程,可以在alter
端引发更多的重试,同时观察通勤
端的两次重试,调查使用其中一次或另一次对参考历史的影响,等等。我不认为这是离题的。这是在问一个例子,但也可以我同意这是一个有效且不明显重复的问题。没有简单的答案出现在脑海中,因为他们总是给出相同的答案,只是在不同的时间内,有时会这样做。
user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil