При множественном доступе к экземпляру Spring Singleton одновременно - PullRequest
6 голосов
/ 06 января 2011

Если вы определите свой сервис в одноэлементной области действия в своем весеннем конфиге, что произойдет, если более одного пользователя попытаются получить к нему доступ (то есть, как зависимость введена в ваш контроллер) одновременно?Должно ли это вызвать конфликт?Или контейнер IoC будет удерживать более поздний вызов до завершения первого?Если это так, то это должно замедлить производительность в больших приложениях, что мне не подходит.Может ли кто-нибудь дать мне правильный ответ?

Кстати, насколько я помню, если он не одноэлементный, контейнер IoC будет объединять несколько экземпляров в зависимости от количества запросов.Может ли кто-нибудь это подтвердить?

Ответы [ 2 ]

13 голосов
/ 06 января 2011

что произойдет, если более одного пользователя попытаются получить к нему доступ (т.е. как зависимость введена в ваш контроллер) одновременно?

К одному бину можно обращаться много раз одновременно. Вот почему он всегда должен быть потокобезопасным

Должно ли это вызвать конфликт?

Только если вам не удастся сделать потокобезопасным

Или контейнер IoC будет удерживать более поздний вызов до завершения первого?

Нет, это было бы ужасно


Кстати, насколько я помню, если он не одноэлементный, контейнер IoC будет объединять несколько экземпляров в зависимости от количества запросов. Может ли кто-нибудь это подтвердить?

Spring имеет следующие области видимости ( см. Справку по Bean Scopes ):

  • singleton (для одного приложения управляется только один экземпляр)
  • прототип (новый экземпляр для каждой инъекции)
  • сеанс (один экземпляр на сеанс HTTP, только в Spring MVC)
  • запрос (один экземпляр на HTTP-запрос, только в Spring MVC)
  • глобальный сеанс (один экземпляр на глобальный сеанс HTTP, только в Spring MVC на основе портлетов)

Также:

Начиная с Spring 3.0, область потока доступна, но по умолчанию не зарегистрирована. Для получения дополнительной информации см. Документацию для SimpleThreadScope.

То, что вы описываете, это пул объектов. Весной это будет реализовано в виде прототипа FactoryBean. А внутри он будет использовать библиотеку типа Apache Commons / Pool .

4 голосов
/ 06 января 2011

Синглтоны - это просто синглтоны. Один экземпляр управляется контекстом Spring, и все запросы проходят через этот экземпляр одновременно. Это зависит от вас, чтобы сделать этот потокобезопасным.

Если ваш bean-компонент не является поточно-ориентированным, подумайте о том, чтобы использовать bean-объекты не синглтоновой области. Spring позволяет использовать области запросов, сеансов и прототипов.

...