Java SpringBean线程安全
我为一个Java类声明一个Springbean,该类用作创建对象的工厂。我想从不同的线程使用这个工厂,我遇到的问题是,当线程尝试使用工厂创建对象时,会被阻塞 据我所知,SpringBean默认为单例,这就是我想要的。我希望工厂是一个单例,但我希望使用这个工厂从不同的线程创建对象。工厂中的方法createObject()未同步,因此我不太明白为什么会出现这种同步问题 关于实现这一目标的最佳方法有何建议 这是工厂的java代码:Java SpringBean线程安全,java,multithreading,spring,singleton,Java,Multithreading,Spring,Singleton,我为一个Java类声明一个Springbean,该类用作创建对象的工厂。我想从不同的线程使用这个工厂,我遇到的问题是,当线程尝试使用工厂创建对象时,会被阻塞 据我所知,SpringBean默认为单例,这就是我想要的。我希望工厂是一个单例,但我希望使用这个工厂从不同的线程创建对象。工厂中的方法createObject()未同步,因此我不太明白为什么会出现这种同步问题 关于实现这一目标的最佳方法有何建议 这是工厂的java代码: public class SomeFactory implements
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;
}
公共类SomeFactory实现BeanFactoryAware{
私人豆厂豆厂;
公共列表createObjects(){
列表对象=新的ArrayList();
add((SomeObject)beanFactory.getBean(SomeObject.class.getName());
归还物品;
}
public void setBeanFactory(BeanFactory BeanFactory)抛出BeanException{
this.beanFactory=beanFactory;
}
}如前所述,这个类中似乎没有任何东西需要线程安全。每次调用createObjects时,都会创建一个新的ConfigurableObjects列表。向该列表添加单个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;
}
private SomeObject someObjectInstance=null;
公共同步列表createObjects(){
列表对象=新的ArrayList();
if(someObjectInstance=null)
{
someObjectInstance=(SomeObject)beanFactory.getBean(SomeObject.class.getName());
}
添加(someObjectInstance);
归还物品;
}
在这种情况下,您需要同步对CreateObjects的访问,如我所示。我发现了这个线程:bean引用的Java类的方法似乎没有同步,除非您将它们写为已同步。当然没有。春天仍然是Java;它读不懂你的心思。单例必须以线程安全的方式编写。您需要发布一些代码。通常情况下,工厂不应该承载太多状态,因此工厂方法通常不应该阻塞。若你们并没有同步任何东西,并没有任何东西会被阻止(尽管状态可能会混乱)。你在createObject方法中做什么?@seanizer我已经编辑了问题并添加了我在工厂中使用的代码。可能是beanFactory导致了同步问题?我不想同步createObjects()方法,因为我想同时从不同的线程调用它。我使用的是一个分析器,当线程调用createObjects(带有beanFactory的行)时,似乎有一些阻塞。回答你的问题,SomeObject是一个原型。