Spring Boot默认请求处理是同步还是异步?对@Async注解的疑问
Spring Boot请求处理默认机制与@Async的区别
核心结论
Spring Boot默认不是异步处理请求,但Web容器的多线程特性会让多个请求并行执行,这是你误以为默认异步的原因。
详细解释
1. Web容器的多线程机制(你看到的“并行处理”来源)
Spring Boot默认使用Tomcat(也可配置Jetty/Undertow)作为Web容器,这些容器会维护一个线程池。每个进来的HTTP请求,都会被分配到线程池里的一个独立线程处理。也就是说:
- 请求1和请求2调用同一个API时,会分别在不同的Tomcat线程中执行,两个线程并行运行,互相不需要等待对方完成。
- 这是Web容器的固有特性,和Spring的
@Async注解无关。
2. Spring默认的请求内处理逻辑是同步的
在单个请求的处理链路中(比如Controller方法 → Service方法 → DAO方法),默认是同步执行的:
- 调用Controller方法后,会依次同步执行里面的代码,等Service方法执行完毕才会继续向下,直到返回响应给客户端。
- 整个请求的处理流程都在分配到的那个Tomcat线程里完成,不会自动开启新线程。
3. @Async注解的作用是什么?
@Async(配合启动类的@EnableAsync)是用来实现方法级别的异步执行,和Web容器的多线程不是一回事:
- 当你给某个方法添加
@Async后,Spring会把这个方法的执行任务提交到专门的异步线程池里,调用这个方法的线程(比如Tomcat线程)不需要等待该方法执行完成,就可以继续执行后续代码。 - 它解决的是单个请求内部的业务逻辑异步问题(比如请求处理时需要调用一个耗时的第三方接口,不想让Tomcat线程一直阻塞等待),而不是多个请求之间的并行问题。
直观示例
无
@Async场景:
请求1 → Tomcat线程A → 同步执行Controller+Service方法 → 返回响应
请求2 → Tomcat线程B → 同步执行Controller+Service方法 → 返回响应
线程A和B并行运行,所以请求2不用等请求1。有
@Async场景:
请求1 → Tomcat线程A → 调用加了@Async的Service方法(任务丢到异步线程池) → 线程A直接返回响应 → Service方法在异步线程C中执行
这里是请求1内部的Service方法异步,不影响请求2和请求1的并行处理。
内容的提问来源于stack exchange,提问作者A.Shenoy
相关产品推荐
相关产品推荐

