В чем разница между Clojure STM (dosync) и синхронизацией Java с блоком?
Я читаю код из проблемы "Спальный парикмахер". (http://www.bestinclass.dk/index.clj/2009/09/scala-vs-clojure-round-2-concurrency.html)
(defn the-shop [a]
(print "[k] entering shop" a)
(dosync
(if (< (count @queue) seats)
(alter queue conj a)
(print "[s] turning away customer" a))))
Чтобы избежать условий гонки, dosync используется, поэтому я спрашиваю себя: "Какая разница (STM) от блока синхронизации Java"? Будет ли он блокировать этот критический код?
Спасибо заранее! Dantas