各类专业网站建设,网站建设必要性,小程序哪家公司做的好,namecheap购买域名文章目录结论1、spring中的Bean从哪里来#xff1f;2、spring中什么样的Bean存在线程安全问题#xff1f;3、如何处理spring Bean的线程安全问题#xff1f;结论
其实#xff0c;Spring 中的 Bean 是否线程安全#xff0c;其实跟 Spring 容器本身无关。Spring框架中没有提…
文章目录结论1、spring中的Bean从哪里来2、spring中什么样的Bean存在线程安全问题3、如何处理spring Bean的线程安全问题结论
其实Spring 中的 Bean 是否线程安全其实跟 Spring 容器本身无关。Spring框架中没有提供线程安全的策略因此spring容器中的Bean本身也不具备线程安全的特性。俺们要透彻理解这个结论我们首先要知道spring中的Bean是从那里来的
1、spring中的Bean从哪里来
在 Spring 容器中除了很多 Spring 内置的 Bean 以外其他的 Bean 都是我们自己通过 Sring 配置来声明的然后由 Spring 容器同意加载。我们在 Spring 声明配置中通常会配置一下内容如class全类名、id也就是Bean 的唯一标识、scope作用域以及 lazy-init是否延时加载等。之后Spring容器根据配置内容使用对应的策略来创建 Bean 的实例。因此Spring 容器中的 Bean 其实都是根据我们自己写的类来创建的实例。因此 Spring 中的 Bean 是否线程安全跟 Spring 容器无关只是交由 Spring 容器托管而已。 那么在 Spring 容器中什么样的 Bean 会存在线程安全问题呢 回答这个问题之前我们得先回忆一下 Spring Bean 的作用域。在 Spring 定义的作用域中其中有 prototype多例 Bean和 singleton单例 Bean。那么定义为 prototype 的 Bean是在每次 getBean 的时候都会创建一个新的对象。定义为 singleton 的 Bean在 Spring 容器中只会存在一个全局共享的实例。基于对以上 Spring Bean 作用域的理解下面我们来分析一下在 Spring 容器中什么样的Bean 会存在线程安全问题
2、spring中什么样的Bean存在线程安全问题
我们已经知道多例 Bean 每次都会新创建新实例也就是说线程之间不存在 Bean 共享的问题。因此多例 Bean 是不存在线程安全问题的。 而单例 Bean 是所有线程共享的一个实例因此就可能会存在线程安全问题。但是单例 Bean 又分为无状态 Bean 和有状态 Bean 。在多线程操作中只会对 Bean 的成员变量进行查询操作不会修改成员变量的值这样的 Bean称之为无状态 Bean 。所以可想而知无状态的单例 Bean 是不存在线程安全问题的但是在多线程操作中如果需要对 Bean 中的成员变量进行数据更新操作这样的 Bean 称之为有状态 Bean 所以有状态的单例 Bean 就可能存在线程安全问题。 所以最终我们得出结论在 Spring 中只有有状态的单例 Bean 才会存在线程安全问题。我们在使用spring的过程中经常会使用到有状态的单例 Bean如果真正遇到了线程安全问题我们该如何处理呢
3、如何处理spring Bean的线程安全问题
处理有状态的 Bean 的线程安全问题有以下三种方法
将 Bean 的作用域由“singleton”单例改为“prototype”多例在 Bean 对象中避免定义可变的成员变量当然这样做不太现实就当我没说在类中定义 Thread Local 的成员变量并将需要的可变成员便来给你保存在 Thread Local 中Thread Local 本身就具备线程隔离的特性这就相当于为每个线程提供了一个独立的变量副本每个线程只需要操作自己的线程副本变量从而解决线程安全问题