我是Clojure的新手,并且一直在尝试了解其交易模型。在使用alter
和commute
玩时,我注意到,如果我在commute
之后alter
ref,则交易将不会提交任何内容(或对任何事物无需更改)。
例如:
(def counter (ref 0))
(def i (ref 0))
(future (dosync
(ref-set counter 1)
(ref-set i 1)
(commute counter inc)
(alter counter inc)))
@counter
和@i
均为0,但是如果我交换commute
和alter
或使用两个commute
s或两个alter
S,则在这种情况下会产生所需的结果(分别为3和1)。
我已经阅读了一些帖子,解释了commute
和alter
的行为有些不同,因为commute
实际上在交易中两次执行(一个是站立的地方,另一个处于"提交"阶段),而忽略了不一致的快照。裁判我只是对这两个组合的奇怪行为感到困惑。
任何人都可以帮助解释它是如何工作的吗?预先感谢!
commute
功能仅在非常狭窄(即罕见)情况下有用,而 May 降低锁定的锁定为代价为更新功能的其他重新尝试。正如您的示例所示,这也使交易的心理模型变得更加复杂(例如,我以前从未见过这个特定问题)。
IMHO使用alter
而不是commute
几乎总是更好,因为alter
更简单,更具防弹性。确实,我通常认为使用commute
是过早优化的情况。