Multithreading 动态变量和线程/睡眠
从我在某处读到的内容来看,如果在Clojure中将一个新值绑定到一个动态变量,那么这个新值只在该线程中可用 因此,为了测试这一点,我创建了以下代码:Multithreading 动态变量和线程/睡眠,multithreading,clojure,dynamic-variables,Multithreading,Clojure,Dynamic Variables,从我在某处读到的内容来看,如果在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)
(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*)))
我的问题是:为什么第一个线程(必须打印“新值”)从未运行?它从不将“新值”打印到控制台。问题是您需要使用元数据将您的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
后,当您运行(运行它)
时,它将打印出:
dynamic var
new-value
如果没有它,您可能会看到打印的警告:
警告:dynamic var未声明为dynamic,因此不可动态重新绑定,但其名称表明并非如此。请指明^:动态变量或更改名称
谢谢,明白了!我正在从静态类型的Java过渡到动态类型的Clojure。我已经习惯了IDE的支持,并且犯了很多类似这样的错误,因为这个工具没有警告我。你提到的“警告”实际上没有出现。谢谢不客气!我在REPL中运行代码时收到警告,在REPL之外运行代码时,我没有检查它是否打印。