研发
精选
Spring Boot 3 与 Java 21 虚拟线程实践
站长发布于 2026/08/21更新于 2026/09/172213 次阅读
Java 21:虚拟线程来了
Java 21 正式转正虚拟线程(Virtual Threads,JEP 444)。对于 IO 密集型的 Web 应用,开启后可用同步写法获得接近异步的吞吐。
在 Spring Boot 3 中启用
spring.threads.virtual.enabled=true
一行配置,Tomcat 将使用虚拟线程处理请求。对比传统平台线程(默认 200 个上限),虚拟线程数量几乎不受限,阻塞在数据库或 HTTP 调用上的时间不再占用 OS 线程。
实战建议
1. 虚拟线程不适合 CPU 密集任务
// IO 密集:适合虚拟线程
@GetMapping("/users")
public List<User> users() {
return userService.findAll(); // 内部阻塞 IO
}
// CPU 密集:继续用平台线程池
var pool = Executors.newFixedThreadPool(8);
2. 避免在 ThreadLocal 中缓存大对象
虚拟线程数量巨大,ThreadLocal 会造成内存放大。Spring 的 RequestContextHolder 已适配,但自定义 ThreadLocal 需谨慎。
3. 与 JDBC 连接池的配合
虚拟线程不等于无限并发,数据库连接池仍是瓶颈。压测确定合理的 maximum-pool-size,避免连接耗尽:
spring:
datasource:
hikari:
maximum-pool-size: 20
压测参考
在一个典型「查询 PostgreSQL + 调用外部 HTTP」的接口上:
- 平台线程(200 上限):约 8k QPS 后排队
- 虚拟线程:约 8k QPS 持平,但 P99 延迟下降约 30%
小结
Spring Boot 3.2+ + Java 21 的组合让「同步写法、异步吞吐」成为现实。迁移成本极低,建议新项目默认开启。