Virtual Threads (Project Loom, Java 21) là thread cực nhẹ do JVM quản lý — không phải OS thread. Bật trong Spring Boot 3.2+ bằng 1 dòng config: spring.threads.virtual.enabled: true — Spring Boot tự dùng cho Tomcat, @Async, @Scheduled.
Vì sao đáng giá: OS thread tốn ~1MB stack, context switch nặng → giới hạn vài nghìn. Virtual Thread tốn ~KB, chạy được hàng triệu; khi block I/O (DB call, HTTP) nó unmount khỏi carrier thread để carrier phục vụ request khác → code blocking quen thuộc scale như non-blocking.
| Virtual Threads | WebFlux (Reactive) | |
|---|---|---|
| Code style | Blocking (quen thuộc) | Non-blocking (Mono/Flux) |
| Complexity | Thấp | Cao (learning curve) |
| Dùng khi | I/O-bound, CRUD app | High-throughput streaming, backpressure |
| CPU-bound | Không giúp | Không giúp |
Lưu ý:
- MDC/ThreadLocal dễ leak → dùng Micrometer Observation API thay raw MDC.
- synchronized pin Virtual Thread vào OS thread → mất lợi ích; dùng ReentrantLock (Java 24 đã gỡ hạn chế pinning này — JEP 491; Java 21 vẫn dính).
- Không cải thiện CPU-bound.