ref-set vs commute vs alter

在Clojure中设置ref的三种方法有什么区别? 我已经多次阅读关于ref-set,commute和alter的文档。 我很困惑哪些在什么时候使用。 有人能为我提供一个简短的描述差异是什么,为什么每个都需要?

作为对软件事务内存系统如何在clojure中工作的一个超级简单的解释; 它会重试交易,直到每个人都能通过,而不会从其下面改变它的值。 你可以通过使用ref-changing-function来做出这个决定,这个函数给出了关于交易之间什么交互是安全的提示。

  • 当你不关心当前值的时候, ref-set是用来ref-set只要把它设置为这个ref-set可以节省你编写类似的东西(alter my-ref (fun [_] 4)) ,把my-ref的值设置为4. (ref-set my-ref 4)更好:)。
    使用ref-set来简单地设置值。

  • alter是最正常的标准之一。 使用此function来更改值。 这是STM的肉。 它使用您传递的函数来更改该值,并且如果无法保证该值从事务开始时不变,则重试。 这是非常安全的,即使在某些情况下,你不需要它是安全的,如增加一个柜台。 你大概要在大部分时间使用alter

  • commute是一个优化版本的改变那些时候,事情的顺序真的没有关系。 是谁给计数器增加了+1,没有区别。 结果是一样的。 如果STM正在决定你的事务是否可以安全地提交,并且它只在通勤操作上有冲突而在alter操作上只有冲突,那么它可以继续并提交新的值而不必重启任何人。 这可以节省偶尔的交易重试,虽然你不会看到在正常的代码从这个巨大的收益。
    commute使用commute