Встроенная в Clojure STM не может действительно включать все ограничения, которые вы ищете, потому что читатели никогда не ждут писателей , а ваши требования требуют, чтобы читатели ждали.
если вы можете простить, не блокируя читателей, тогда вы можете пойти дальше и
(. (java.lang.Thread. #(dosync (write stuff)) start))
(. (java.lang.Thread. #(dosync (read stuff)) start))
если вам нужны читатели для блокировки, вам понадобится другой STM, в мире их много