ambitiouswolf 2013-03-25 11:13
浏览 370
已采纳

spring getBean的线程安全问题 安全发布

class A{
private int i;
//setter、getter
}

spring配置文件:


程序中,
final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
final A a = context.getBean("a", A.class);

问题:
多个线程同时访问a变量,a中的成员变量i的值有问题吗?会不会有的线程看到的是默认值0?(即使getBean方法是synchronized的,也还是有这个问题)如果不是,求spring源码分析。

  • 写回答

1条回答 默认 最新

  • 征服.刘华强 2013-03-25 11:38
    关注

    1-会不会有的线程看到的是默认值0?
    不会,因为A类是通过Spring的IOC容器拿出来的,换句话说你拿到A这个对象的时候Spring已经把A创建好了 并且把i设置成了123.所以无论多少个线程,只要是通过Spring拿到的A对象 i都属性都不会是0

    2-在说线程安全问题
    Spring的Ioc容器提供了俩种策略(singleton)


    默认singleton=true //单例模式
    即无论多个个线程 多少次调通context.getBean("a", A.class);
    拿到的A对象都是一个 这样的话 多个线程去同时修改属性 i 就会出现线程安全问题。
    除非在修改i的属性时进行同步 (关于方法同步就不细说了)

    默认singleton=false//非单例模式
    每次 context.getBean("a", A.class); Spring都会新创建一个对象返回。

    说的够清楚了吧,给分吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?