首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对读者来说,拥有自己的时间表意味着什么?

对读者来说,拥有自己的时间表意味着什么?
EN

Stack Overflow用户
提问于 2013-09-21 23:16:20
回答 1查看 75关注 0票数 1

在57:25的我们到了吗演讲中,Rich谈到了多版本并发控制。列出的优点之一是读者能够有自己的时间线。我很好奇这在实践中意味着什么。这是通过简单地让读者保存观察到的价值的历史来实现的吗?或者它是在clojure的STM的帮助下完成的呢?如果能看到一个如何在clojure中使用这一点的例子,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 22:20:57

我认为Rich的意思是,事务之外的读者每次试图读取一个值时都会看到它的当前状态,而这个世界观对于他们每个人来说都是单独的。

当您有两个不相关的函数(在同一事务中不绑定)试图获取变量(原子、引用、代理等)的当前值时,它们不能保证获得(参见)相同的值。

示例:

代码语言:javascript
运行
复制
(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 "---------------------------------")])

样本输出:

代码语言:javascript
运行
复制
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
---------------------------------

它的工作原理:

  1. 将计数器变量声明为ref (事务性变量类型),并将其初始值设置为0。
  2. 创建具有匿名函数的Java线程,该函数通过在循环中递增计数器并".start“线程来更改计数器。
  3. 以两步的方式读取计数器,间隔1ms延迟并打印每个值。如您所见,这两个值都与预期不同。这模拟了观察同一对象的两个对象接收不同数据时的不同时间线。
  4. 与上面相同,但在世界快照中。放置睡眠函数不会影响输出值。两者是平等的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18938659

复制
相关文章

相似问题

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