Подтвердить что ты не робот

Безопасны ли потоки объектов Spring?

Являются ли Spring объектами потокобезопасными и как сделать их потокобезопасными?

4b9b3361

Ответ 1

Это два несвязанных вопроса:

Есть Spring Beans Thread Safe?

Нет.

Spring имеет разные bean scopes (например, Prototype, Singleton и т.д.), но все эти области применения применяются, когда создается bean, Например, bean "prototype" будет создан каждый раз, когда этот bean будет "введен", тогда как "singleton" scoped bean будет создан один раз и разделен в контексте приложения. Существуют и другие области, но они просто определяют временной интервал (например, "область" ), когда будет создан новый экземпляр.

Вышеизложенное мало, если что-то связано с безопасностью потоков, поскольку, если несколько потоков имеют доступ к bean (независимо от области), это будет зависеть только от конструкции этого bean или не быть "потокобезопасным".

Причина, по которой я сказал "мало, если что", потому что это может зависеть от проблемы, которую вы пытаетесь решить. Например, если вас беспокоит, могут ли два или несколько HTTP-запросов создать проблему для одного и того же bean, существует область запрос, которая создаст новый экземпляр из bean для каждого HTTP-запроса, поэтому вы можете" думать "о конкретном bean как" безопасном" в контексте нескольких HTTP-запросов. Но он по-прежнему не является потокобезопасным с помощью Spring, поскольку, если несколько потоков используют этот bean в рамках одного и того же HTTP-запроса, он возвращается к дизайну bean (ваш дизайн класса поддержки bean).

Как создать/спроектировать поточный безопасный "объект"?

Существует несколько способов, которые, вероятно, слишком долго перечислены здесь, но вот несколько примеров:

  • Создайте свой Beans неизменяемый: например, не имеете сеттеров и используйте только аргументы конструктора для создания bean. Существуют и другие способы, такие как шаблон Builder и т.д.

  • Создайте свой Beans безстоящий: например, bean, который делает что-то вроде функции (или нескольких). Этот bean в большинстве случаев может и должен быть безстоящим, что означает, что он не имеет какого-либо состояния, он только делает вещи с аргументами функции, которые вы предоставляете каждый раз (по каждому вызову)

  • Создайте свой Beans persistent: это особый случай "неизменяемости", но имеет очень хорошие свойства. Обычно используется в функциональном программировании, где Spring (по крайней мере пока) не так полезен, как в императивном мире, но я использовал их с проектами Scala/Spring.

  • Создайте свой Beans с помощью блокировок [последнее]: я бы рекомендовал против этого, если вы не работаете в библиотеке более низкого уровня. Причина в том, что мы (люди) плохо разбираемся в блокировках. Только так мы воспитаны и воспитаны. Все происходит параллельно, если нам не нужно "помещать этот дождь в паузу, позвольте мне получить зонтик". Компьютеры, однако, все о замках, когда вы говорите "несколько вещей одновременно", поэтому есть некоторые из нас (исключительные люди), которые делают свою справедливую долю и реализуют библиотеки на основе этих блокировок. Большинство других людей могут просто использовать эти библиотеки и не беспокоиться о concurrency.