动态变量和 Thread/sleep

Dynamic var and Thread/sleep

根据我在某处读到的内容,如果您将新值绑定到 Clojure 中的动态变量,则该新值仅在该线程中可用。

因此,为了对此进行测试,我创建了以下代码:

(def *dynamic-var* "dynamic var")

(defn run-it [] 
  (future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
  (future (Thread/sleep 1000) (println *dynamic-var*)))

我的问题是:为什么第一个线程(必须打印 "new-value")从不 运行?它从不将 "new-value" 打印到控制台。

问题是您需要使用元数据将 var 标记为动态:

(def ^:dynamic *dynamic-var* "dynamic var")

(defn run-it [] 
  (future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*)))
  (future (Thread/sleep 1000) (println *dynamic-var*)))

加上^:dynamic,当你运行(run-it)时,它会打印出:

dynamic var
new-value

没有它,您可能会看到打印的警告:

Warning: dynamic-var not declared dynamic and thus is not dynamically rebindable, but its name suggests otherwise. Please either indicate ^:dynamic dynamic-var or change the name.