如果您不能更改那个 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` 的定义以使其成为锁定的版本。