关于spring:Spring中的Bean是线程安全的吗

121次阅读

共计 1976 个字符,预计需要花费 5 分钟才能阅读完成。

大家好,我是被编程耽搁的文艺 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,如果大家还有其余疑难,能够在评论区留言。如果我的解析对你有帮忙,请动动手指一键三连分享给更多的人。
明天的面试题解析就到这里,咱们下期再见。关注我,面试不再难!
最初,预祝大家在 2022 年都可能弯道逆袭,升职加薪,迎娶你心中的白富美!

关注微信公众号『Tom 弹架构』回复“简历”可获取配套材料。

本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『Tom 弹架构』可获取更多技术干货!
原创不易,保持很酷,都看到这里了,小伙伴记得点赞、珍藏、在看,一键三连加关注!如果你感觉内容太干,能够分享转发给敌人滋润滋润!

正文完
 0