如果你无法更改这个 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` 的定义修改为带锁版本。