Understanding Clojure concurrency example

Posted by dusha on Stack Overflow See other posts from Stack Overflow or by dusha
Published on 2011-01-06T02:46:01Z Indexed on 2011/01/06 3:53 UTC
Read the original article Hit count: 212

Hello,

I just go through various documentation on Clojure concurrency and came accross the example on the website (http://clojure.org/concurrent_programming).

(import '(java.util.concurrent Executors))
(defn test-stm [nitems nthreads niters]
(let [refs  (map ref (replicate nitems 0))
      pool  (Executors/newFixedThreadPool nthreads)
      tasks (map (fn [t]
                   (fn []
                     (dotimes [n niters]
                       (dosync
                         (doseq [r refs]
                           (alter r + 1 t))))))
                (range nthreads))]
(doseq [future (.invokeAll pool tasks)]
  (.get future))
(.shutdown pool)
(map deref refs)))

I understand what it does and how it works, but I don't get why the second anonymous function fn[] is needed?

Many thanks,

dusha.

P.S. Without this second fn [] I get NullPointerException.

© Stack Overflow or respective owner

Related posts about concurrency

Related posts about clojure