如果您无法更改 AOT 编译的代码,因为这确实不在您的控制之下,那么您是否可以评估一下以下代码,并确保在系统启动时从多个线程调用 `require` 之前进行评估?当然,println 语句是可选的。
(def original-require clojure.core/require)
(defn my-serialized-require [& args]
(locking clojure.lang.RT/REQUIRE_LOCK
(println "my-serialized-require 获取了锁...")
(apply original-require args)
(println "my-serialized-require 释放锁...")))
(alter-var-root #'clojure.core/require (fn [& args] my-serialized-require))
如果以上方案对您不可行,您是否允许编译 Clojure 源代码的修改版本并在项目中使用它?如果可以,您可以将 `require` 的定义修改为带锁的版本。