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