はのは、私が原子を持っているとしましょう:原子をスレッドセーフな方法で初期化するには?
(def my-atom (atom nil))
次のようにその後、私はそれを初期化:
(defn init-atom [init-value]
(when (nil? @my-atom)
(reset! my-atom init-value)))
init-atom
が異なるスレッドから同時に呼び出された場合、I競合状態が発生することがあります。私は安全かつ正確に原子を初期化する方法を探しています。そこに何か?
UPD:次のように
は実際に私がそれを初期化しています:
(defn init-atom [produce-init-fn]
(when (nil? @my-atom)
(reset! my-atom (produce-init-fn)])))
produce-init-fn
は副作用が含まれていてもよいです。
(let [o (Object.)]
(defn init-atom [init-value]
(locking o
(when (nil? @my-atom)
(reset! my-atom init-value)))))
異なるスレッドから 'init-atom'を同時に呼び出す必要があるのはなぜですか?さらに重要なのは、どうしてあなたは[global state](http://programmers.stackexchange.com/q/148108)を使うのですか? –
私のドメインでは、このアトムは異なるスレッドからアクセス可能なキャッシュです。だから最初に何かがあるかどうかを調べる。何もなければ、そこに価値を置く。 @SamEstep – OlegTheCat
原子が初期化されると、その値はその後変更されますか?言い換えれば、 "cache"によって、あなたは[memoize'](https://clojuredocs.org/clojure.core/memoize)で使われている原子のようなものか、['promise'](https: /clojuredocs.org/clojure.core/promise)は一度だけ値を受け取りますか? –