比方说,我有一个原子:如何以线程安全的方式初始化原子?
(def my-atom (atom nil))
然后我初始化如下:
(defn init-atom [init-value]
(when (nil? @my-atom)
(reset! my-atom init-value)))
如果init-atom
从不同的线程同时调用,我比赛可能出现的条件。我正在寻找一种安全正确地初始化原子的方法。有什么吗?
UPD:
其实我对其进行初始化,如下所示:
(defn init-atom [produce-init-fn]
(when (nil? @my-atom)
(reset! my-atom (produce-init-fn)])))
produce-init-fn
可能含有副作用。
为什么你需要从不同的线程同时调用'init-atom'?更重要的是,为什么你会使用[global state](http://programmers.stackexchange.com/q/148108)呢? –
在我的域中,这个原子可以从不同的线程访问缓存。所以首先检查是否有任何东西。如果没有 - 在那里提供价值。 @SamEstep – OlegTheCat
原子初始化后,它的值会在那之后改变吗?换句话说,通过“缓存”,你的意思是像['memoize'](https://clojuredocs.org/clojure.core/memoize)中使用的原子,或者像['promise'](https:/ /clojuredocs.org/clojure.core/promise)只收到一次值? –