Spring中的Bean是線程安全的嗎?

大家好,我是被編程耽誤的文藝Tom。

金三銀四的招聘季到了,Spring 作為最熱門的框架,在很多大廠面試中都會問到相關(guān)的問題。
前幾天,就有好幾個同學就問我,在面試中被問到這樣一個問題。Spring中的Bean是不是線程安全的。大家總覺得在面試過程差了一點意思。但是又說不上來是什么原因。這是因為,大家可能對Spring 的本質(zhì)還欠缺一些深度的思考。
今天,咱們不兜圈子不繞彎,上來直接說答案,大家關(guān)注點個贊,本視頻跟大家徹底講明白。
其實,Spring中的Bean是否線程安全,其實跟Spring容器本身無關(guān)。Spring框架中沒有提供線程安全的策略,因此,Spring容器中在的Bean本身也不具備線程安全的特性。咱們要透徹理解這個結(jié)論,我們首先要知道Spring中的Bean是從哪里來的。

1、Spring中Bean從哪里來的?
在Spring容器中,除了很多Spring內(nèi)置的Bean以外,其他的Bean都是我們自己通過Spring配置來聲明的,然后,由Spring容器統(tǒng)一加載。我們在Spring聲明配置中通常會配置以下內(nèi)容,如:class(全類名)、id(也就是Bean的唯一標識)、 scope(作用域)以及l(fā)azy-init(是否延時加載)等。之后,Spring容器根據(jù)配置內(nèi)容使用對應的策略來創(chuàng)建Bean的實例。因此,Spring容器中的Bean其實都是根據(jù)我們自己寫的類來創(chuàng)建的實例。因此,Spring中的Bean是否線程安全,跟Spring容器無關(guān),只是交由Spring容器托管而已。
那么,在Spring容器中,什么樣的Bean會存在線程安全問題呢?回答,這個問題之前我們得先回顧一下Spring Bean的作用域。在Spring定義的作用域中,其中有 prototype( 多例Bean )和 singleton ( 單例Bean)。那么,定義為 prototype 的Bean,是在每次 getBean 的時候都會創(chuàng)建一個新的對象。定義為 singleton 的Bean,在Spring容器中只會存在一個全局共享的實例?;趯σ陨蟂pring Bean作用域的理解,下面,我們來分析一下在Spring容器中,什么樣的Bean會存在線程安全問題。

2、Spring中什么樣的Bean存在線程安全問題?
我們已經(jīng)知道,多例Bean每次都會新創(chuàng)建新實例,也就是說線程之間不存在Bean共享的問題。因此,多例Bean是不存在線程安全問題的。
而單例Bean是所有線程共享一個實例,因此,就可能會存在線程安全問題。但是單例Bean又分為無狀態(tài)Bean和有狀態(tài)Bean。在多線程操作中只會對Bean的成員變量進行查詢操作,不會修改成員變量的值,這樣的Bean稱之為無狀態(tài)Bean。所以,可想而知,無狀態(tài)的單例Bean是不存在線程安全問題的。但是,在多線程操作中如果需要對Bean中的成員變量進行數(shù)據(jù)更新操作,這樣的Bean稱之為有狀態(tài)Bean,所以,有狀態(tài)的單例Bean就可能存在線程安全問題。
所以,最終我們得出結(jié)論,在Spring中,只有有狀態(tài)的單例Bean才會存在線程安全問題。我們在使用Spring的過程中,經(jīng)常會使用到有狀態(tài)的單例Bean,如果真正遇到了線程安全問題,我們又該如何處理呢?

3、如何處理Spring Bean的線程安全問題?
處理有狀態(tài)單例Bean的線程安全問題有以下三種方法:
1、將Bean的作用域由 “singleton” 單例 改為 “prototype” 多例。
2、在Bean對象中避免定義可變的成員變量,當然,這樣做不太現(xiàn)實,就當我沒說。
3、在類中定義 ThreadLocal 的成員變量,并將需要的可變成員變量保存在 ThreadLocal 中,ThreadLocal 本身就具備線程隔離的特性,這就相當于為每個線程提供了一個獨立的變量副本,每個線程只需要操作自己的線程副本變量,從而解決線程安全問題。
都已經(jīng)看到這里了, 相信大家應該已經(jīng)知道了 Spring中的Bean是否線程安全以及如何處理Bean的線程安全問題。
下次再遇到這個面試題,你會回答了嗎?
我是被編程耽誤的文藝Tom,如果大家還有其他疑問,可以在評論區(qū)留言。如果我的解析對你有幫助,請動動手指一鍵三連分享給更多的人。
今天的面試題解析就到這里,我們下期再見。關(guān)注我,面試不再難!

關(guān)注『 Tom彈架構(gòu) 』回復“簡歷”可獲取配套資料。

本文為“Tom彈架構(gòu)”原創(chuàng),轉(zhuǎn)載請注明出處。技術(shù)在于分享,我分享我快樂!如果您有任何建議也可留言評論或私信,您的支持是我堅持創(chuàng)作的動力。關(guān)注『 Tom彈架構(gòu) 』可獲取更多技術(shù)干貨!

原創(chuàng)不易,堅持很酷,都看到這里了,小伙伴記得點贊、收藏、在看,一鍵三連加關(guān)注!如果你覺得內(nèi)容太干,可以分享轉(zhuǎn)發(fā)給朋友滋潤滋潤!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容