ref-set vs commute vs alter

Tim*_*dge 54 clojure

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

Art*_*ldt 88

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

  • ref-set当你不关心当前价值时.把它设置为这个!ref-set为你节省了写作的东西,比如(alter my-ref (fun [_] 4))将my-ref的值设置为4. (ref-set my-ref 4)肯定会看起来好多了:).
    使用ref-set简单设置的值.

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

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

  • 事务总是始终获得一致的值,因此它会重新尝试整个事务.它比我的超级简短回答更加明智.非常值得它自己的研究 (3认同)