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


單例Bean不是線程安全的
Spring中Bean默認是單例模式的,框架並沒有對bean進行對線程封裝和處理。

如果Bean是有狀態的,那就需要開發人員自己來進行線程安全的保證,最簡單的辦法就是改變bean的作用域,把singleton改為prototype,這樣每次請求bean就相當於是new Bean(),這樣就可以保證線程安全了。

  • 有狀態就是有數據存儲功能
  • 無狀態就是不會保存數據。controller、service和dao層本身並不是線程安全的,但如果只是調用里面的方法,而且多線程調用一個實例的方法,會在內存中復制變量,這是自己線程的工作內存,是線程安全的。

Dao層會操作數據庫Connection,Connection是帶有狀態的,比如說數據庫事務,Spring的事務管理器使用ThreadLocal為不同線程維護了一套獨立的connection副本,保證線程之間不會互相影響。(問題:spring是如何保證事務獲取同一個connection)

不要再bean中聲明任何有狀態的實例變量或者類變量,如果必須如此,那么就使用ThreadLocal把變量變成線程私有的,如果bean的實例變量或者類變量需要在多個線程之間共享,那么只能使用synchronized、lock、CAS等實現線程同步


免責聲明!

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



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