You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:45:03