2013-06-27 3 views
11

Я хочу знать, являются ли Spring одноэлементные бобы потокобезопасными, если да, то почему, если нет, то почему?Являются ли пружинные одноэлементные бобы потокобезопасными?

Как я начинаю с весны, поэтому помощь будет оценена.

+1

Весна не гарантирует безопасность потока. Это будет вашей ответственностью. Spring создаст Singleton, но если его изменяет, то он может быть небезопасным потоком. – NINCOMPOOP

+0

Безопасность потоков не имеет ничего общего с Singletons. Чистый синглтон или весна не имеет значения. –

+0

Не гарантированное создание только одного экземпляра в многопоточной среде? – StKiller

ответ

4

Spring singleton beans не являются потокобезопасными только потому, что Spring их создает. Сожалею.

3

Весна просто управляет жизненным циклом однополюсного компонента и поддерживает единый экземпляр объекта. Безопасность резьбы не имеет к этому никакого отношения.

если нет, то почему?

Поскольку однопользовательская безопасность и безопасность потоков - это две разные концепции. Вы можете пойти по безопасности потоков с синхронизированным ключевым словом

+1

, или сделав ваш Spring Bean без гражданства, который, я думаю, лучший подход. – DaveH

0

если нет, то почему?

Потому что вы можете иметь ссылку на объекты, не связанные с потоками, в вашем одиночном тоне.

Но если вы этого не сделаете, и вы используете Spring для ввода любых переменных экземпляра, тогда да, они являются потокобезопасными.

18

Нет. Оба понятия даже не связаны.

Singletons около создание. Этот шаблон проектирования гарантирует создание только одного экземпляра класса.

Безопасность нити составляет около исполнение. Цитирую Wikipedia:

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

Таким образом, безопасность потоков зависит только от кода и кода. И именно по этой причине весенние бобы сами по себе не являются потокобезопасными.

+0

Я понимаю, что это старо, но поскольку это был один из первых результатов Google, я пришел к поиску в области безопасности весны, я хотел бы указать, что весна «Singleton beans» отличается от шаблона дизайна «singleton», на который ссылается этот ответ к. , , «Spring singleton bean» на самом деле означает «Весенний боб» с областью Singleton. –

+0

@ScottShipp И вы думаете, что это совпадение, что он называется Singleton scope? Spring создает bean-компонент, если он не существует, и предоставляет существующий экземпляр в противном случае. Звучит это знакомо? – zeroflagL

+1

Пожалуйста, обратитесь к [Весенняя документация в области Singleton] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-singleton): «Концепция Spring одноэлементного компонента отличается от шаблона Singleton, как определено в книге моделей Gang of Four (GoF). GoF Singleton жестко кодирует область действия объекта, так что создается один и только один экземпляр определенного класса за каждый ClassLoader. Сфера применения Singleton Single Spring лучше всего описана как для контейнера, так и для каждого компонента ». –

0

Весна не гарантирует безопасность резьбы. Это будет вашей ответственностью. Spring создаст Singleton, но если его изменяет, то он может быть небезопасным потоком. Обязанность программиста IT позаботиться о классе весеннего боба таким образом, чтобы он был надежным в потоковом режиме.

0

Весной однобочечные бобы не будут иметь никакого состояния (без гражданства). Singleton bean scope гарантирует, что один экземпляр для BeanFactory. Таким образом, в среде с несколькими потоками он не гарантирует единый экземпляр даже при использовании Singleton bean scope.

Так, чтобы исправить это, мы должны изменить область боба от одноточечно возможности для прототип объема, как это разработчики ответственность за обеспечение безопасности потока.

0

У меня другое восприятие: Spring Singleton beans создаются один раз, и в любой момент времени может быть только один экземпляр.

Допустим, у вас есть переменная экземпляра, которая изменена в несинхронизированном методе. В многопоточной среде один и тот же экземпляр класса будет назначен всем потокам, а 2 параллельных потока могут обновлять/изменять переменные экземпляра, которые могут привести к непредвиденной ситуации. Синглтон бобы не обеспечивает безопасность потока и теперь вы знаете, что использование переменных экземпляра может привести к неожиданному результату, у вас есть 2 варианта решения такой же:

  1. Не используйте переменные экземпляра в многопоточной среде. OR
  2. Использовать синхронизированный блок/ключевое слово на методах везде, где переменные экземпляра изменены, чтобы избежать неожиданных результатов.