研发
精选

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 的组合让「同步写法、异步吞吐」成为现实。迁移成本极低,建议新项目默认开启。