1

Event Sourcing に関するこのブログ投稿に触発されて、Java ConcurrentHashMap に相当する Clojure 構造を実装できるかどうか疑問に思っています。Rich による Clojure のメーリング リストへのこの投稿に基づいて、以下の部分的な実装を考え出しましたが、同時実行が安全かどうかはわかりません。そうでない場合、そのような構造を構築するためのより良い方法を誰かが提案できますか?

(defn ^M h []
   (let [m (atom {})]
     (reify M
       (put [_ k v] (swap! m assoc k v))
       (get [_ k] (get @m k))
       (putIfAbsent [_ k v]
         (swap! m #(if (get % k)
                     %
                     (assoc % k v))))
       (replace [_ k old-v new-v]
          (swap! m #(if (= old-v (get % k))
                     (assoc % k new-v)
                     %))))))

(definterface M
   (put [k v])
   (get [k])
   (putIfAbsent [k v])
   (replace [k old-v new-v]))

参考文献:

http://www.jayway.com/2013/04/02/event-sourcing-in-clojure/

https://groups.google.com/d/msg/clojure/dK6x_QpCpvo/OitIryoFSAgJ

4

1 に答える 1

1

スワップ内のキーの存在をチェックしているため、スレッドセーフです! これは、2 つのスレッドが同時に put を試みた場合、そのうちの 1 つが再試行​​し、条件を再度確認して、マップを変更せずに終了することを意味します。

于 2013-04-29T00:42:57.170 に答える