Threadsafe在clojure中弹出?

Céd*_*eau 4 stack clojure thread-safety

我在http://www.learningclojure.com/2010/11/yet-another-way-to-write-factorial.html找到了这个代码,但我不明白是否/如何假设pop-task是线程安全的.它不允许返回两次相同的头?

(def to-do-list(atom'()))
(defn add-task![t](swap!to-do-list#(cons t%)))
(defn pop-task![](让[ h(第一个@ to-do-list)](交换!待办事项列表休息)h))

如果是这样,是否可以继续使用原子并写下偷看和交换!原子地,或者这是ref机制的工作?

-

谢谢你们两个不错的答案!

kot*_*rak 7

或者你降到较低的水平.

(def to-do-list (atom nil))

(defn add-task!
   [t]
   (swap! to-do-list conj t))

(defn pop-task!
   []
   (let [[h & r :as l] @to-do-list]
     (if (compare-and-set! to-do-list l r)
       h
       (recur))))
Run Code Online (Sandbox Code Playgroud)