【发布时间】:2014-04-20 00:26:02
【问题描述】:
我有一个原子包裹了一个元素的向量:
(def items (atom [1 2 3 4]))
我想自动删除第一项并返回它。这段代码说明了逻辑:
(let [x (first @items)]
(swap! items #(subvec % 1))
x)
但是当多个线程相互竞争时,上面的代码是不正确的。读取和更新之间存在竞争条件。
正如this answer 中所说的,原子用于不协调的同步访问。我希望这可以用原子而不是 ref 来完成,因为原子更简单。
有没有只使用原子而不使用引用的解决方案? (我将尝试使用手表,看看情况如何。)如果你的答案坚持需要一个参考,你能否解释一下为什么需要参考,即使当一个人想要“协调同步访问许多身份时建议使用参考” "(与上面相同的链接)。
这与How do I update a vector element of an atom in Clojure?和Best way to remove item in a list for an atom in Clojure等其他相关问题不同,因为我想更新一个向量原子并返回值。
【问题讨论】:
-
作为记录,Clojure Google 小组How to update an atom & return the change? 中可能有类似的讨论。
-
好问题!!!!!!
-
您添加了标签atom ...但您的问题与它有什么关系? (网络提要格式)
标签: clojure