我应该在交换之外或之内运行支票!功能?

dyn*_*eed 2 clojure

当我swap!有条件地去一个原子的值时,条件应该包装swap!还是它应该是函数swap!调用的一部分?

(import '(java.time Instant))

(def not-nil? (comp not nil?))

(defonce users (atom {
  "example user 1" {:ts (Instant/now)}
  "example user 2" {:ts (Instant/now)}
}))

(defn update-ts [id]
  (if (not-nil? (get @users id))
    (swap! users assoc-in [id :ts] (Instant/now))))
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我在做之前正在为用户进行存在检查swap!.但是users在检查之后但是之前不能删除用户swap!?那么,将检查放在运行的函数中是否更安全swap!

(defn update-ts [id]
  (swap! users (fn [users]
                   (if (not-nil? (get users id))
                       (assoc-in users [id :ts] (Instant/now))
                       users))))
Run Code Online (Sandbox Code Playgroud)

ama*_*loy 7

但是检查后但是在用户之前用户是否无法删除用户swap!?那么,将检查放在运行的函数中是否更安全swap!

是的,完全正确.你永远不应该决定如何从原子上的任何地方变异swap!原子.既然swap!是唯一保证是原子的操作,那么每次你做其他事情(即,从其外部做出关于原子的决定swap!)时,你会引入竞争条件.