concurrency - Clojure 中的 commute 和 alter 有什么区别?

标签 concurrency clojure transactions stm

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

越简单越好理解差异。

最佳答案

假设commute如果使用正确,Refs 的观察值应该没有差异,除非使用 commute可能有助于在竞争激烈的情况下提交事务,而使用 alter 很难做到这一点。 .当然,当这适用时,结果会有相当大的差异......

使用副作用更容易准确地说明事情有何不同。这是一个单线程示例来说明基本属性

  • alter每次“交易尝试”将被调用一次(可能只有一次),

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


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

使用一些 Thread/sleep s 和少数线程可能会在 alter 上引发更多重试边,同时仍在 commute 上观察两次重试一边,调查使用其中一个等对 Ref history 的影响。

关于concurrency - Clojure 中的 commute 和 alter 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426524/

相关文章:

scala - Scala 中的并发原语

java - java中如何在一个线程完成时结束其他线程的处理

Emacs Live - 未找到命名空间

java - 在 Leiningen 项目中使用 Emacs 中的 Java

java - 为什么要同步同步列表?

java - 继承的非最终字段对其他线程可见吗?

Clojure:::标签的含义

java - 如何安全地强制提交 Spring - hibernate 事务

java - 使用 JTA 和 JPA EntityManager 关闭自动事务启动

sql-server - NOLOCK 是 SQL Server 2005 中 SELECT 语句的默认值吗?