在Clojure中,我们使用STM来实现并发。
我的问题是STM使用数据的时间点值,这不是引入了歧义吗?
我们如何知道被访问的值是什么?
发布于 2013-06-20 01:09:40
Clojure中的STM (通过ref和dosync)提供了一个事务上下文,在这个上下文中,当从外部世界查看所有涉及的refs时,可以保证“同时”进行所有更新。
目标是保持系统中价值的一致性,典型的例子是两个银行账户之间的资金转移。如果您要将100美元从帐户A转到帐户B,那么您需要同时更改A和B的金额。
在这个例子中,在事务内部处理的数量的读取值实际上是没有歧义的,因为在完成从事务外部读取的时刻,只可能出现以下情况:
在事务内部,您只读(不修改)的ref可能会将它们的值从事务的一个点更改到另一个点,这称为写偏差(请参阅Clojure Programming -第4章,Refs,写偏差)。为了避免这种情况,您可以使用ensure (而不是deref),这将导致如果这些ref中的任何一个的值发生更改(您仅读取的值),则整个事务将被重试。
https://stackoverflow.com/questions/17195959
复制相似问题