在Clojure中,我们使用STM进行并发。
我的问题是STM使用数据的时间点值,是不是这引入了歧义?
我们怎么知道访问了什么值?
答案 0 :(得分:8)
Clojure中的STM(通过ref
和dosync
)提供了一个事务上下文,其中所有更新都保证“同时”发送给从外部查看的所有参考世界。
目标是保持系统中价值的一致性,典型的例子是两个银行账户之间的资金转移。如果您从账户A转账到账户B的100美元,那么您将希望同时更改A和B的金额。
在这个例子中,对于在事务中处理的金额读取的值实际上没有歧义,因为在完成事务外部的读取时,只有以下情况是可能的:
当在事务内部时,您只读取(并且不修改)的ref
可以将其值从事务的一个点更改为另一个点,这称为< em> write skew (参见Clojure Programming - 第4章,参考,写歪斜)。为了避免这种情况,你可以使用ensure
(而不是deref
),这会导致如果这些ref
中的任何一个的值发生变化(你只读过的那个),那么整个交易将被重试。
答案 1 :(得分:4)
Clojurians在这种情况下使用具有非常具体含义的“时间”和“价值”来消除这种歧义。在这种情况下,“时间”是“序列中的时间”或划时代的时间,而不是墙上的时间。所以时间描述了此身份的值序列中的哪个值。
价值是在某个时间点身份的不变内容。该值可以是简单的(原始值或原子值)或复合值,并由任意结构化的不变值组成。重要的是值不会改变,所以如果你想知道使用了哪个值,你可以简单地打印或记录它
高度推荐此视频