我正在经历Clojure Koans,现在正在玩原子游戏。我的问题与Koans无关,而是一个普遍的问题。
考虑以下Koans的(简化)示例:
(def atomic-clock (atom 0))
(meditations
(= 1 (do
(swap! atomic-clock inc)
@atomic-clock)))
交换文档!声明inc
可以多次调用该函数(在这种情况下),因此该函数应无副作用。
显然,inc
它没有副作用,但不是幂等的。这是否意味着上面的断言实际上可能仍然失败?也就是说,在确实多次调用该函数的情况下,原子的值会增加一次以上吗?
swap!
如果有多个线程争用修改Atom ,则可能多次调用传递给该函数的函数。但是,只要没有副作用,Atom的因果历史将只反映最后一次调用的返回。1个
这是一种可能的情况:
线程1尝试(swap! atomic-clock inc)
。
线程2尝试相同。
线程2设法执行其swap!
第一个。
线程1尝试对原子进行比较并交换,但失败了,因为它对原始值的概念现在已过时。
线程1重试并成功提交。
在这里有3个调用inc
,在线程1上两个,在线程2上一个。
inc
不是幂等的事实不是问题。
1抽象地考虑;Clojure实际上并不存储Atom的历史记录信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句