我正在为一个Java类声明一个Spring bean,它用作创建对象的工厂。我想从不同的线程使用这个工厂,我遇到的问题是线程在尝试使用工厂创建对象时被阻止。
据我所知,春豆是默认的单身人士,这就是我想要的。我希望工厂是单件,但我想从不同的线程使用这个工厂创建对象。工厂中的方法createObject()不同步,因此我不太清楚为什么我遇到这种同步问题。
有关哪种方法可以达到此目的的最佳方法?
这是工厂的java代码:
public class SomeFactory implements BeanFactoryAware {
private BeanFactory beanFactory;
public List<ConfigurableObjects> createObjects() {
List<ConfigurableObjects> objects = new ArrayList<ConfigurableObjects>();
objects.add((SomeObject)beanFactory.getBean(SomeObject.class.getName()));
return objects;
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
答案 0 :(得分:1)
如上所述,这个类中似乎没有任何东西需要线程安全。每次调用createObjects时都会创建一个新的ConfigurableObjects List。在该List中添加一个SomeObject bean然后返回它。
一个问题:SomeObject实例本身应该是单例吗?如果是这样,那么你需要保存它,如果它是null,则只调用getBean。
private SomeObject someObjectInstance = null;
public synchronized List<ConfigurableObjects> createObjects() {
List<ConfigurableObjects> objects = new ArrayList<ConfigurableObjects>();
if (someObjectInstance = null)
{
someObjectInstance = (SomeObject)beanFactory.getBean(SomeObject.class.getName());
}
objects.add(someObjectInstance);
return objects;
}
在这种情况下,您需要按照我所示的方式同步对CreateObjects的访问。