当我要有条件地对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))))

在上面的示例中,在执行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))))

最佳答案



是的,完全正确。除了在该原子的swap!内部之外,您不应该决定如何从任何地方突变该原子。由于swap!是唯一保证是原子的操作,因此每次执行其他操作(即,从swap!外部确定原子)时,都会引入竞争条件。

关于clojure - 我应该在交换的外部还是内部进行检查!功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44509911/

10-14 11:07