【问题标题】:Atoms and references原子和引用
【发布时间】:2010-05-15 06:59:16
【问题描述】:

根据书Programming Clojure refs 管理对共享状态的协调同步更改,而原子管理对共享状态的非协调同步更改。

如果我理解正确,“协调”意味着多个更改被封装为一个原子操作。如果是这种情况,那么在我看来,协调只需要使用 dosync 调用。

例如有什么区别:

(def i (atom 0))
(def j (atom 0))

(dosync
  (swap! i inc)
  (swap! j dec))

和:

(def i (ref 0))
(def j (ref 0))

(dosync
  (alter i inc)
  (alter j dec))

【问题讨论】:

    标签: clojure


    【解决方案1】:

    Refs 使用... dosync 进行协调! Dosync 和 refs 一起工作,dosync 并不神奇,对其他引用类型或副作用一无所知。

    你的第一个例子相当于:

    (def i (atom 0))
    (def j (atom 0))
    
    (do ; <--
      (swap! i inc)
      (swap! j dec))
    

    【讨论】:

    • 好吧,我误以为 dosync 启动了一个原子代码块。感谢您的回答。
    • 它启动一个事务,但不保证你放入其中的所有内容都是原子的。原子操作是 alter 和 ref-set - 我必须在事务中调用这些操作。例如,如果您在事务中执行 IO,它可能会发生不止一次。
    猜你喜欢
    • 1970-01-01
    • 2015-09-24
    • 2012-11-01
    • 1970-01-01
    • 2023-03-30
    • 2015-05-10
    • 1970-01-01
    • 2017-02-17
    • 2016-05-15
    相关资源
    最近更新 更多