为了账号安全,请及时绑定邮箱和手机立即绑定

Spring中的Bean是线程安全的吗?

标签:
Spring

大家好,我是被编程耽误的文艺Tom。

金三银四的招聘季到了,Spring 作为最热门的框架,在很多大厂面试中都会问到相关的问题。

前几天,就有好几个同学就问我,在面试中被问到这样一个问题。Spring中的Bean是不是线程安全的。大家总觉得在面试过程差了一点意思。但是又说不上来是什么原因。这是因为,大家可能对Spring 的本质还欠缺一些深度的思考。

今天,咱们不兜圈子不绕弯,上来直接说答案,大家关注点个赞,本视频跟大家彻底讲明白。

其实,Spring中的Bean是否线程安全,其实跟Spring容器本身无关。Spring框架中没有提供线程安全的策略,因此,Spring容器中在的Bean本身也不具备线程安全的特性。咱们要透彻理解这个结论,我们首先要知道Spring中的Bean是从哪里来的。

1、Spring中Bean从哪里来的?

在Spring容器中,除了很多Spring内置的Bean以外,其他的Bean都是我们自己通过Spring配置来声明的,然后,由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的线程安全问题有以下三种方法:

1、将Bean的作用域由  “singleton”  单例   改为  “prototype”  多例。

2、在Bean对象中避免定义可变的成员变量,当然,这样做不太现实,就当我没说。

3、在类中定义   ThreadLocal   的成员变量,并将需要的可变成员变量保存在      ThreadLocal    中,ThreadLocal    本身就具备线程隔离的特性,这就相当于为每个线程提供了一个独立的变量副本,每个线程只需要操作自己的线程副本变量,从而解决线程安全问题。

都已经看到这里了, 相信大家应该已经知道了 Spring中的Bean是否线程安全以及如何处理Bean的线程安全问题。 

下次再遇到这个面试题,你会回答了吗?

我是被编程耽误的文艺Tom,如果大家还有其他疑问,可以在评论区留言。如果我的解析对你有帮助,请动动手指一键三连分享给更多的人。

今天的面试题解析就到这里,我们下期再见。关注我,面试不再难!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
资深架构师
手记
粉丝
12
获赞与收藏
25

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消