Безопасность резьбы пружинных бобов - PullRequest
2 голосов
/ 13 августа 2010

Я объявляю bean-компонент Spring для класса Java, который используется в качестве фабрики для создания объектов.Я хочу использовать эту фабрику из разных потоков, проблема, с которой я сталкиваюсь, заключается в том, что потоки блокируются, когда они пытаются создать объект, используя фабрику.это то, что я хочу.Я хочу, чтобы фабрика была одноэлементной, но я хотел бы создать объект с использованием этой фабрики из разных потоков.Метод createObject () на заводе не синхронизирован, поэтому я не очень хорошо понимаю, почему у меня возникает эта проблема с синхронизацией.

Какие-либо предложения о том, какой подход является лучшим для достижения этого?1006 * Это код 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 Ответ

1 голос
/ 19 августа 2010

Как написано, не похоже, что в этом классе есть что-то, что должно быть поточно-ориентированным.Вы создаете новый список ConfigurableObjects каждый раз, когда вызываете createObjects.В этот список вы добавляете один компонент SomeObject, а затем возвращаете его.

Один вопрос: должен ли экземпляр SomeObject представлять собой сам одиночный объект?Если это так, то вам нужно сохранить его и вызывать 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, как я показал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...