Spring Boot SPA并发问题:多用户访问时的实例与资源隔离
嘿,这个问题问到点子上了,刚好是Spring Boot Web应用运行机制里的常见困惑,我给你拆解清楚:
Spring Boot SPA多用户访问的核心运行逻辑
1. 会不会为每个请求创建Web应用实例?
绝对不会!Spring Boot(底层依赖Tomcat这类Servlet容器)是单实例多线程的运行模式——服务器启动时,整个Web应用只会初始化一次,所有用户的请求都是由这个实例下的不同线程来处理的。
举个直观的例子:你标注了@SpringBootApplication的启动类,只会被实例化一次;你写的Controller、Service这些Bean,默认都是单例的,全应用共享这一份实例。
2. 内存资源是不是互不共享?
这得分场景来看:
- 全局共享的资源:如果你的Bean里定义了一个全局变量(比如在Controller里直接写
private List<String> globalList = new ArrayList<>();),那这个列表是所有请求线程共享的——A用户加个元素,B用户刷新就能看到,甚至还会出现并发修改导致的数据错乱问题。 - 用户/请求隔离的资源:要是把数据存在
HttpSession里,或者用ThreadLocal存储,或者在每个请求方法里新建的局部变量,那这些资源就是完全隔离的,不同用户之间看不到对方的数据。
3. 列表添加内容后,每个用户能看到自己的吗?
这完全取决于你把列表存在哪里:
- 👉 存在单例Bean的全局变量里:不行!所有用户共用同一个列表,A加的内容B能看到,反之亦然,还容易出并发问题。
- 👉 存在请求局部变量里:比如在Controller的接口方法里新建
List<String> userList = new ArrayList<>();,每个请求都是独立的,用户只能看到自己这次请求里添加的内容。 - 👉 存在HttpSession里:把列表放到用户的Session中(
session.setAttribute("userList", userList);),每个用户有专属的Session,各自的列表互相隔离,只能看到自己的。 - 👉 存在前端SPA的内存里:比如Vue/React组件里的状态列表,这数据存在用户自己的浏览器内存里,服务器根本碰不到,自然每个用户只能看到自己的内容。
内容的提问来源于stack exchange,提问作者David Jones
相关产品推荐
相关产品推荐

