原子和参比实际有什么不同?
我理解原子声明不同,并通过swap!
函数进行更新,而参考文献在dosync
中使用alter
。然而,内部实现似乎非常相似,这让我想知道为什么我会使用其中一个而不是另一个。
例如,原子文档页面(http://clojure.org/atoms)声明:
内部交换!读取当前值,将函数应用于它,并尝试将其进行比较和设置.由于另一个线程可能在中间时间内更改了值,因此它可能不得不重试,并在自旋循环中这样做。实际效果是,该值将始终是将所提供的函数应用于当前值的结果,这是原子性的。但是,因为这个函数可能被多次调用,所以它必须没有副作用。
所描述的方法听起来与参考文献中使用的STM非常相似。
发布于 2013-08-09 07:55:04
不同的是,你不能协调多个原子之间的变化,但是你可以协调多个参考文献之间的变化。
Ref更改必须在dosync
块内部进行。档案中的所有变化都发生了,或者都没有发生(原子的),但这延伸到了所有的变化到参考文献在该档案中。这在很大程度上类似于数据库事务。
例如,假设您希望从一个集合中删除一个项并将其添加到另一个集合中,但是没有人看到两个集合都没有该项的情况。用原子来保证是不可能的,但是你可以用参考文献来保证。
发布于 2013-08-09 07:51:33
请记住:
对我来说,我不在乎原子和参考文献之间的实现差异。我关心的是每个用例的“用例”。
我使用参考文献,我需要改变不止一个引用类型的状态,我需要ATM语义。当我改变一种引用类型的状态时,我使用原子(对象,取决于您如何看待它)。
例如,如果我需要增加网页分析系统中的页面点击次数,我就使用原子。如果我需要在两个帐户之间转账,我使用参考文献。
https://stackoverflow.com/questions/18150567
复制相似问题