当我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)
但是检查后但是在用户之前用户是否无法删除用户
swap!?那么,将检查放在运行的函数中是否更安全swap!?
是的,完全正确.你永远不应该决定如何从原子上的任何地方变异swap!原子.既然swap!是唯一保证是原子的操作,那么每次你做其他事情(即,从其外部做出关于原子的决定swap!)时,你会引入竞争条件.
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |