首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure STM歧义因子

Clojure STM歧义因子
EN

Stack Overflow用户
提问于 2013-06-20 00:02:19
回答 1查看 354关注 0票数 4

在Clojure中,我们使用STM来实现并发。

我的问题是STM使用数据的时间点值,这不是引入了歧义吗?

我们如何知道被访问的值是什么?

EN

回答 1

Stack Overflow用户

发布于 2013-06-20 01:09:40

Clojure中的STM (通过refdosync)提供了一个事务上下文,在这个上下文中,当从外部世界查看所有涉及的refs时,可以保证“同时”进行所有更新。

目标是保持系统中价值的一致性,典型的例子是两个银行账户之间的资金转移。如果您要将100美元从帐户A转到帐户B,那么您需要同时更改A和B的金额。

在这个例子中,在事务内部处理的数量的读取值实际上是没有歧义的,因为在完成从事务外部读取的时刻,只可能出现以下情况:

  1. 事务已经开始,但尚未完成,因此这些值尚未“正式”更改。稍后可以提交或重试事务处理,但当您读取它们时,这是每个帐户的状态。
  2. 事务处理已完成,因此读取的金额是修改后的值。

在事务内部,您只读(不修改)的ref可能会将它们的值从事务的一个点更改到另一个点,这称为写偏差(请参阅Clojure Programming -第4章,Refs,写偏差)。为了避免这种情况,您可以使用ensure (而不是deref),这将导致如果这些ref中的任何一个的值发生更改(您仅读取的值),则整个事务将被重试。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17195959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档