atom 和 refs 实际有何不同?
我知道原子的声明方式不同,并通过swap!
函数更新,而 refsalter
在dosync
. 然而,内部实现似乎非常相似,这让我想知道为什么我会使用一个而不是另一个。
例如,atoms 的文档页面 ( http://clojure.org/atoms ) 指出:
在内部,交换!读取当前值,将函数应用于它,并尝试比较并设置它。由于另一个线程可能在中间时间更改了该值,它可能必须重试,并在自旋循环中这样做。最终效果是该值将始终是原子地将提供的函数应用于当前值的结果。但是,由于该函数可能会被多次调用,所以它必须没有副作用。
所描述的方法听起来与我用于参考的 STM 非常相似。