1

考虑 clojure repl 中的以下代码序列

(def elems (atom {}))
(swap! elems assoc 42 [:a 7])
elems

产生预期{42 [:a 7]}。现在试试

(compare-and-set! elems elems (atom {}))

生产false,意味着compare-and-set!操作没有成功。我很惊讶,因为我期望elems测试与elems内部compare-and-set!操作相同。我知道我可以reset!用来完成无条件重置原子的目标,但我想知道为什么compare-and-set!不完全一样?

4

1 回答 1

5

compare-and-set!作用于原子引用的值,而不是原子本身。

clojure.core/compare-and-set!
([atom oldval newval])
  Atomically sets the value of atom to newval if and only if the
  current value of the atom is identical to oldval. Returns true if
  set happened, else false

你可能想要这个:

(compare-and-set! elems @elems {})
于 2013-03-16T16:50:22.510 回答