你好
我有一个使用 Clojure 1.11 编写的服务,该服务在 Jetty 12 上运行。
我尝试使用 Java 21 和 Jetty 在虚拟线程上运行该服务。
以下约束条件阻止虚拟线程卸载
虚拟线程在以下情况下无法卸载:
当它被锁定到其载体时
以下是虚拟线程被锁定的情况
- 虚拟线程在同步块或方法中运行代码
- 虚拟线程运行本地方法或外部函数(参见外部函数和内存API)
我使用 '-Djdk.tracePinnedThreads=full' 键运行服务并发现 LazySeq
同步 LazySeq 方法会锁定虚拟线程
clojure.lang.LazySeq.sval(LazySeq.java:42) <== monitors:1
clojure.lang.LazySeq.seq(LazySeq.java:51) <== monitors:1
(顺便说一句,同步 Delay deref 方法也存在同样的问题)
在我看来,Clojure 标准库的实现和 Clojure 内部本身大量使用了 'synchronized' 方法,这与虚拟线程的约束条件不兼容。
我理解有大量代码,将其适应为与虚拟线程兼容需要巨大的努力和成本,但可能有一些关于与虚拟线程约束条件兼容的计划。
谢谢!