Spring Boot 异步编程实战:@Async 的 8 个坑+正确姿势
引言 "我明明加了 @Async,为什么接口还是变慢了?"——打断点一看,方法还在 Tomcat 线程里同步执行,注解形同虚设。另一个故事:压测时监控发现线程数一路涨到几千个,最后 unable to create new native thread 整个服务挂掉——排查发现 @Async 没指定线程池,任务全堆在一个无界队列里。 @Async 可能是 Spring 里"看起来最简单、坑却最密集"的注解:一个注解就让方法异步执行,但它背后是 AOP 代理、线程池、异常处理、上下文传递四套机制。这篇文章把生产中最常见的 8 个坑一次讲透——每坑给翻车代码、原理、修复代码,最后给一份可以直接抄的生产级配置。 一、前置:@Async 的工作原理 调用方线程 ──→ 代理对象(@Async 由 AOP 生成代理) │ ├─ 方法上有 @Async? │ ├─ 是 → 把"方法调用"包装成 Task,提交给线程池 → 立即返回 │ └─ 否 → 直接反射调用目标方法(同步) │ └─ 代理只拦截"外部通过 Spring Bean 的调用" this.xxx() 内部调用不走代理 → 注解失效 ....