### Vars
[Vars](http://clojure.org/vars) 是一種可以有一個被所有線程共享的root binding并且每個線程線程還能有自己線程本地(thread-local)的值的一種引用類型。
下面的語法創建一個Var并且給它一個root binding:
```
(def <em>name</em> <em>value</em>)
```
你可以不給它一個值的。如果你沒有給它一個值,那么我們說這個Var是 "unbound". 同樣的語法可以用來修改一個Var的root binding。
有兩種方法可以創建一個已經存在的Var的線程本地binding(thread-local-binding):
```
(binding [<em>name</em> <em>expression</em>] <em>body</em>)
(set! <em>name</em> <em>expression</em>) ; inside a binding that bound the same name
```
關于binding宏的用法我們前面已經介紹過了. 下面的例子演示把它和 `set!` 一起使用. 用set!來修改一個由binding bind的Var的線程本地的值。
```
(def v 1)
(defn change-it []
(println "2) v =" v) ; -> 1
(def v 2) ; changes root value
(println "3) v =" v) ; -> 2
(binding [v 3] ; binds a thread-local value
(println "4) v =" v) ; -> 3
(set! v 4) ; changes thread-local value
(println "5) v =" v)) ; -> 4
(println "6) v =" v)) ; thread-local value is gone now -> 2
(println "1) v =" v) ; -> 1
(let [thread (Thread. #(change-it))]
(.start thread)
(.join thread)) ; wait for thread to finish
(println "7) v =" v) ; -> 2
```
我們一般不鼓勵使用 Vars, 因為線程之間對于同一個Var的修改沒有做很好的協調,比如線程A在使用一個Var的root值,然后才發現,在它使用這個值的時候,已經有一個線程B在修改這個值了。