大家好,我是被编程耽搁的文艺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弹架构 』可获取更多技术干货!
原创不易,保持很酷,都看到这里了,小伙伴记得点赞、珍藏、在看,一键三连加关注!如果你感觉内容太干,能够分享转发给敌人滋润滋润!