在57:25的我们到了吗演讲中,Rich谈到了多版本并发控制。列出的优点之一是读者能够有自己的时间线。我很好奇这在实践中意味着什么。这是通过简单地让读者保存观察到的价值的历史来实现的吗?或者它是在clojure的STM的帮助下完成的呢?如果能看到一个如何在clojure中使用这一点的例子,那就太好了。
发布于 2013-10-14 22:20:57
我认为Rich的意思是,事务之外的读者每次试图读取一个值时都会看到它的当前状态,而这个世界观对于他们每个人来说都是单独的。
当您有两个不相关的函数(在同一事务中不绑定)试图获取变量(原子、引用、代理等)的当前值时,它们不能保证获得(参见)相同的值。
示例:
(let [
; 1.
counter (ref 0)
; 2.
_ (.start (Thread. (fn [] (while (< @counter 1000000)
(dosync (alter counter inc))))))
_ (Thread/sleep 10)
; 3.
_ (let [r1 @counter
_ (Thread/sleep 1)
r2 @counter]
(println "free reader 1: " r1 "free reader 2:" r2))
; 4.
_ (dosync (let [r1 @counter
_ (Thread/sleep 1)
r2 @counter]
(println "frozen reader 1: " r1 "frozen reader 2:" r2)))
_ (println "---------------------------------")])样本输出:
free reader 1: 30573 free reader 2: 31295
snapshot reader 1: 105498 snapshot reader 2: 105498
---------------------------------
free reader 1: 37567 free reader 2: 38369
snapshot reader 1: 181392 snapshot reader 2: 181392
---------------------------------
free reader 1: 37317 free reader 2: 88570
frozen reader 1: 467471 frozen reader 2: 467471
---------------------------------它的工作原理:
https://stackoverflow.com/questions/18938659
复制相似问题