views:

70

answers:

1

I am declaring a Spring bean for a Java class that is used as a factory to create objects. I want to use this factory from different threads, the problem I am experienced is that threads are blocked when they try to create an object using the factory.

As far as I know spring beans are singletons by default, and this is what I want. I want the factory to be a singleton but I would like to create object using this factory from different threads. The method createObject() in the factory is not synchronized, therefore I do not understand very well why I'm having this synchronization issue.

Any suggestions about which is the best approach to achieve this?

This is the java code for the factory:

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  A: 

As written, it doesn't appear that there's anything in this class that needs to be thread safe. You create a new ConfigurableObjects List each time you call createObjects. To that List you add a single SomeObject bean and then return it.

One question:is the SomeObject instance supposed to be a singleton itself? If so, then you need to save it and only call getBean if it's null like so.

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;
}

In this case, you would need to synchronize access to CreateObjects as I've shown.

Granger44
I do not want the createObjects() method to be synchronized since I want to call it from different threads concurrently. I was using a profiler and it seems that there are some blocking when the threads invoke the createObjects(the line with the beanFactory).Answering your question, SomeObject is a prototype.
yeforriak