如果你无法更改那段 AOT 编译的代码,因为它确实不在你的控制之下,那么你在系统启动时确保在某些代码(如以下所示)在多个线程从多个线程中调用 require
之前被评估,这是否在你的控制之下?当然,println 是可选的。
(def original-require clojure.core/require)
(defn my-serialized-require [& args]
(locking clojure.lang.RT/REQUIRE_LOCK)
(println "my-serialized-require acquired the lock...")
(apply original-require args)
(println "my-serialized-require releasing lock...")))
(alter-var-root #'clojure.core/require (fn [& args] my-serialized-require))
如果这对你来说不可能,你允许编译 Clojure 源代码的修改版本并在你的项目中使用它吗?如果可以,你可以修改 `require` 的定义以使其为锁定版本。