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-会不会有的线程看到的是默认值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都会新创建一个对象返回。
说的够清楚了吧,给分吧