春豆线安全

时间:2010-08-13 14:57:32

标签: java multithreading spring singleton

我正在为一个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;
}

}

1 个答案:

答案 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的访问。