ref-set vs commute vs alter

时间:2011-02-15 02:05:16

标签: clojure

在Clojure中设置ref值的3种方法有什么不同?我已经多次阅读过关于ref-set,commute和alter的文档。我很困惑哪些时候可以使用哪些。有人可以简要介绍一下这些差异是什么以及为什么需要这些差异吗?

1 个答案:

答案 0 :(得分:87)

作为软件事务内存系统如何在clojure中工作的一个非常简单的解释;它会重试事务,直到他们每个人都通过,而不会从其下面更改其值。您可以通过使用ref-changing-functions来帮助它做出这个决定,这些函数可以提示交易之间哪些交互是安全的。

  • ref-set 适用于您不关心当前值的情况。 只需将其设为此即可! ref-set (alter my-ref (fun [_] 4))只是为了将my-ref的值设置为4 (ref-set my-ref 4)ref-set会让你感到焦虑。alter确实看起来好多了:)。 使用alter只需设置值。

  • commute 是最正常的标准版。使用此功能可更改值。这是STM的核心。它使用您传递的函数来更改值并重试,如果它无法保证该值在事务开始时保持不变。这是非常安全的,即使在某些情况下你不需要它 安全,比如增加一个计数器。 您可能希望大多数时间都使用commute

  • {{1}} 是alter的优化版本,适用于事情顺序无关紧要的时间。没有区别是谁给柜台增加了+1。结果是一样的。如果STM决定您的事务是否可以安全提交并且它只在通勤操作上有冲突而在alter操作上没有冲突,则它可以继续并提交新值而无需重新启动任何人。这可以节省偶尔的事务重试,但是你不会在普通代码中看到巨大的增益。
    尽可能使用{{1}}。