{{thread-bound?}} 为线程本地绑定返回 true,即使这些绑定不是由当前线程绑定的。这与文档字符串相反,文档字符串表示如果返回 true,则 {{set!}} 应该成功。
这是一个示例 REPL 会话,其中一个线程建立了一个绑定,这些绑定被传送到第二个线程,第二个线程检查 thread-bound? 以查看是否可以设置绑定,thread-bound? 返回 true,表明可以设置绑定,第二个线程尝试设置绑定,并且第二个线程收到一个 IllegalStateException
Clojure 1.5.1
user=> (def ^:dynamic *set-me* nil)
#'user/*set-me*
user=> (defn try-to-set [] (binding [*set-me* 1] (doall (pcalls #(if (thread-bound? #'*set-me*) (set! *set-me* (inc *set-me*)))))))
#'user/try-to-set
user=> (try-to-set)
IllegalStateException 无法设置:*set-me* 从非绑定线程 clojure.lang.Var.set (Var.java:230)
user=>
*方法:* 当存在绑定且那个绑定不是由当前线程建立的时,thread-bound? 应该返回 false。该补丁为 Var 添加了一个新功能,因为核心没有看到非公开的 Var$TBox 的可见性。
*补丁:* thread-bound.diff
*审核人:* Alex Miller