2014-02-20 73 views
1

在阅读clojure programming后,我有几个关于参考和原子以及clojure参考类型的问题,而且大多数问题与本书有关。Clojure,原子和参考文献

第一:

的书说,大约协调,和它说:“协同动作是其中多个参与者必须以获得正确的结果进行合作。”这是否意味着如果我有3 fn fn1,fn2fn3,并且它们中的每一个都会执行一些可能会改变参考状态的操作(假设它发生在每个自己的Thread中),它在链接操作中以同步方式发生?例如,fn1的输出是fn2等的输入。

二:

我无法理解refsatoms之间的差异。该书说refs用于协调同步,atoms用于不协调的同步。它们中的每一个(refsatoms)都有自己的示例,其中atoms以多功能(1个原子2功能)操作的方式使用,而多个refs具有1个功能。这本书并没有举例说明为什么我们不应该或不能以相反的方式去做。

回答

3
  • 原子允许多个线程将转换应用于单个值并保证转换是原子的。 swap!取原子和期望当前原子值的函数。用当前值调用该函数的结果存储在原子中。多个对swap!的调用可能会交错,但每个调用都将独立运行。
  • 参考号允许多个线程以协调方式更新多个值。对sync内的所有裁判的所有更新都将完成或不会完成。您必须编写代码,以便满足事务重试的要求。如果您可以放松操作的顺序,可能会降低重新尝试交易的机会(但不保证它),但有一些潜在的性能调整。
2

区别真的很容易。

refs在一个事务下运行(类似于数据库事务)。想象一下银行系统。你可以代表一个账户作为参考。
要转移资金,您需要启动一个Clojure STM交易 - 通过(dosync) - 。从ref-1减去X的金额,并将该金额加到帐户ref-2
如果出现问题,Clojure STM将重新开始操作。
想象一下没有交易。您从ref-1中减去X金额,然后将该金额添加到ref-2之前,系统中出现问题。你的客户不会感到满意(如果你没有被任何方式起诉)。

Clojure STM实施为MVCC

原子另一方面不需要交易到位操作。没有协调时原子很方便。例如,计数器可增加Web分析系统中访问页面的总数。

看一看Clojure Refs。它提供了很多有价值的信息。