Spring Beans线程安全吗?

不.

Spring有不同的bean 范围(例如Prototype,Singleton等),但是所有这些范围强制都在创建bean时 进行.例如,每次"注入"一个"原型"范围的bean都会被创建,而一个"单个"范围的bean将被创建一次并在应用程序上下文中共享.还有其他范围,但是它们只是定义了何时创建新实例的时间范围(例如"范围").

以上内容与线程安全无关,因为如果多个线程可以访问一个bean(无论范围如何),那么它仅取决于该bean的 design 是或不是"线程安全"的.

我之所以说"很少,如果有的话"是因为它可能取决于您要解决的问题.例如,如果您担心两个或更多个HTTP请求是否可能对同一个bean造成问题,则有一个"请求"范围,它将为每个HTTP请求创建一个新的bean实例,因此您可以将"特定" bean视为"在多个HTTP请求的上下文中是"安全的".但是 仍然不是真正的线程安全线程,因为如果多个线程在同一 HTTP请求中使用此bean,它将返回到bean设计( your bean支持类的设计.

如何使/设计线程安全的"对象"?

有几种方法,可能在这里列出太久了,但是这里有一些示例:

  • 设计您的bean 不可变:例如,没有设置方法,仅使用构造函数参数来创建bean.还有其他方法,例如构建器模式,等等.

  • 设计您的bean 无状态:例如,一个可以做某事的bean可以只是一个函数(或多个).在大多数情况下,此bean可以并且应该是无状态的,这意味着它没有任何状态,只有具有每次(每次调用)提供的函数参数的事物

  • 设计您的bean 永久 :这是一个"不可变"的特例,但具有一些非常好的属性.通常在函数式编程中使用,其中Spring(至少到目前为止)没有在命令式世界中有用,但是我已经将它们用于Scala/Spring项目中.

  • 设计带有锁的bean [不得已]:除非您正在使用级别的库,否则我建议不要这样做.原因是我们(人类)对锁的想法不好.就像我们成长和培养的方式一样.一切并行进行,而无需我们"暂停下雨,让我打伞".但是,当您"同时谈论多个事情"时,计算机都是关于锁的,因此我们中的某些人(特殊人士)正在公平地分享自己的知识并基于这些锁实现库.其他大多数人都可以使用这些库,而不必担心并发.

原文地址:https://www.cnblogs.com/huangwentian/p/14665982.html