Spring Bean被多调用共享时,修改状态后其他调用/线程能否获取最新值?
Spring Bean状态更新与线程可见性问题解答
问题1:由Spring创建的Bean会被所有调用使用,若在某次调用中更新了Bean的上下文,该更新是否会对Spring应用的其他调用生效?
- 核心取决于Bean的作用域:
- 单例(Singleton,Spring默认作用域):整个应用生命周期内只有这一个Bean实例,所有调用共享该实例。如果更新了Bean的成员变量这类状态,其他调用必然会看到这个变更——比如A请求把Bean的
userName改成"Tom",紧接着B请求读取userName,拿到的就是"Tom"。 - 原型(Prototype)/请求(Request)/会话(Session)等作用域:每个调用、请求或会话都会生成全新的Bean实例。你更新的只是当前实例的状态,其他调用拿到的是独立的新实例,完全不受影响。
- 单例(Singleton,Spring默认作用域):整个应用生命周期内只有这一个Bean实例,所有调用共享该实例。如果更新了Bean的成员变量这类状态,其他调用必然会看到这个变更——比如A请求把Bean的
问题2:对于Spring创建的Bean,若修改该类的局部变量(例如修改某个变量的值),这个新值是否会对新线程或Spring应用API的新调用可见?
- 完全不会。局部变量是线程私有的:每个线程调用方法时,局部变量会被创建在当前线程的方法栈中,仅属于该线程的当前方法执行上下文。
- 举个实际例子:Bean里有方法
public void calculate() { int count = 0; count = 5; },线程A调用这个方法修改了count,线程B再调用该方法时,它的count还是从0开始,根本看不到线程A修改后的5——因为两个count是完全独立的变量,存在于不同的线程栈中。
内容的提问来源于stack exchange,提问作者Kakarot
相关产品推荐
相关产品推荐

