The fourth kind of Clojure reference type is the dynamic var. Since Clojure 1.3, all vars are static by default. A var must be explicitly declared in order to be dynamic. Once declared, a dynamic var can be bound to new values on a per-thread basis.
Bindings on different threads do not block each other. An example is as follows:
(def ^:dynamic *foo* "bar") (println *foo*) ; prints bar (binding [*foo* "baz"] (println *foo*)) ; prints baz (binding [*foo* "bar"] (set! *foo* "quux") (println *foo*)) ; prints quux
As dynamic binding is thread-local, it may be tricky to use in multithreaded scenarios. Dynamic vars have been long abused by libraries and applications as a means to pass in a common argument to be used by several functions. However, that style is acknowledged to be an antipattern and is discouraged. Typically, in antipattern, dynamic vars are wrapped by a macro to contain the dynamic thread-local binding in the lexical scope. This causes problems with...