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 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退
  • ¥20 win系统的PYQT程序生成的数据如何放入云服务器阿里云window版?