Spring框架中的單例bean是線程安全的嗎?


1、介紹兩個概念

      有狀態的bean:對象中有實例變量(成員變量),可以保存數據,是非線程安全的

      無狀態的bean:對象中沒有實例變量(成員變量),不能保存數據,可以在多線程環境下共享,是線程安全的

2、spring的線程安全問題

      2.1 我們都知道spring中的bean默認都是單例的,ioc容器中一個類只會存在一個實例對象。這種設計是怎么保證線程安全的?

        一般不會出現線程安全問題。在spring中,絕大部分bean都是無狀態的,因此即使這些bean默認是單例的,也不會出現線程安全問題的。比如controller、service、dao這些類,這些類里面通常不會含有成員變量,因此它們被設計成單例的。如果這些類中定義了實例變量,就線程不安全了,所以盡量避免定義實例變量。

      2.2 對於spring中有狀態的bean,比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder,為什么也能夠設計成單例的呢?它是怎么保證線程安全的?

    對於有狀態的bean,spring采用ThreadLocal進行處理,使它們成為線程安全可以共享的對象
    對於有狀態的bean,也可以使用原型模式(prototype),每次使用時都會重新生成一個對象,解決了線程不安全的問題
    無狀態的Bean適合使用不變模式,即單例模式,這樣可以共享實例,提高性能。有狀態的Bean,多線程環境下不安全,適合使用Prototype原型模式。Prototype: 每次對bean的請求都會創建一個新的bean實例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM