ambitiouswolf
ambitiouswolf
2013-03-25 11:13

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条回答

  • nimasike 温故而知新666 8年前

    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都会新创建一个对象返回。

    说的够清楚了吧,给分吧

    点赞 评论 复制链接分享

相关推荐