Managing Per-Thread State with Vars
When you call def or defn, you create a var. In all the examples so far in the book, you pass an initial value to def, which becomes the root binding for the var. For example, the following code creates a root binding for foo of 10:
|||(def ^:dynamic foo 10)|
The binding of foo is shared by all threads. You can check the value of foo on your own thread:
You can also verify the value of foo from another thread. Create a new thread, passing it a function that prints foo. Don’t forget to start the thread:
|||user=> (.start (Thread. (fn  (println foo))))|
In the previous example, the call to start returns nil, and then the value of foo is printed from a new thread. ...