Project Loom 让「一个请求一个线程」重新变得廉价,但很多老代码在虚拟线程下反而会变慢甚至死锁。下面是最常见的五个坑。
第一,synchronized 会 pin 住载体线程(carrier thread),高并发时调度器被拖垮——改用 ReentrantLock。第二,Thread Local 在百万级虚拟线程下内存暴涨。第三,native 方法调用同样会 pin 线程。第四,依赖线程池大小的限流逻辑在新模型下失效。第五,被第三方库里的同步阻塞偷偷卡住。
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> doWork()); // 注意避免 synchronized 临界区
}
迁移前先用 -Djdk.tracePinnedThreads=full 跑一遍,把 pin 点全部暴露出来再动手。