Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBean线程安全_Java_Multithreading_Spring_Singleton - Fatal编程技术网

Java SpringBean线程安全

Java SpringBean线程安全,java,multithreading,spring,singleton,Java,Multithreading,Spring,Singleton,我为一个Java类声明一个Springbean,该类用作创建对象的工厂。我想从不同的线程使用这个工厂,我遇到的问题是,当线程尝试使用工厂创建对象时,会被阻塞 据我所知,SpringBean默认为单例,这就是我想要的。我希望工厂是一个单例,但我希望使用这个工厂从不同的线程创建对象。工厂中的方法createObject()未同步,因此我不太明白为什么会出现这种同步问题 关于实现这一目标的最佳方法有何建议 这是工厂的java代码: public class SomeFactory implements

我为一个Java类声明一个Springbean,该类用作创建对象的工厂。我想从不同的线程使用这个工厂,我遇到的问题是,当线程尝试使用工厂创建对象时,会被阻塞

据我所知,SpringBean默认为单例,这就是我想要的。我希望工厂是一个单例,但我希望使用这个工厂从不同的线程创建对象。工厂中的方法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;
}
公共类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是一个原型。