并发多线程环境下, 触发spring3的getBean的一个bug, bean的scope为prototype(在spring-framework-3.0.0.RELEASE和spring-framework-3.0.3.RELEASE测试过)。
bug见:https://jira.springsource.org/browse/SPR-7423
svn源码提交号为:3603;revised constructor argument caching for highly concurrent creation scenarios (follow-up to SPR-7423)
bug在3.0.4版本被修正。
bug修正(具体修改请看spring svn源码):
1。把volatile方式调整为同步方式来保证代码正确性与健壮性:
去除RootBeanDefinition中resolvedConstructorOrFactoryMethod、constructorArgumentsResolved、resolvedConstructorArguments、preparedConstructorArguments的四个属性修饰符volatile,增加constructorArgumentLock对象在访问上述四个属性相关代码对constructorArgumentLock加synchronized来保证同步。
2。涉及org/springframework/beans/factory中的以下类:
RootBeanDefinition.java
DefaultListableBeanFactory.java
AbstractAutowireCapableBeanFactory.java
ConstructorResolver.java
SimpleInstantiationStrategy.java
concurrent get bean test will be java.lang.NullPointerException:
frist/Person.java文件:
/**
*
*/
package first;
/**
* person bean
*
* @author yangwm Aug 5, 2010 11:20:16 AM
*/
public class Person {
private String name;
private int age;
private String hobby;
public Person(String name, int age, String hobby) {
this.name = name;
this.age = age;
this.hobby = hobby;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Person{name=");
sb.append(name);
sb.append(", age=");
sb.append(age);
sb.append(", hobby=");
sb.append(hobby);
sb.append("}");
return sb.toString();
}
public String getName() {
return nam