1. 程式人生 > 其它 >Spring中的單例Bean是執行緒安全的嗎?

Spring中的單例Bean是執行緒安全的嗎?

Spring框架中的單例Bean是執行緒安全的麼?

Spring中的Bean預設是單例模式的,框架並沒有對bean進行多執行緒的封裝處理。
如果Bean是有狀態的那就需要開發人員自己來進行執行緒安全的保證, 最簡單的辦法就是改變bean的作用域把 "singleton"改為'protopyte'這樣每次請求Bean就相當於是new Bean() 這樣就可以保證執行緒的安全了。

  1. 有狀態就是有資料儲存功能 (比方是servic 裡面存了一個count值 用於記數,這個就不是執行緒安全的)
  2. 無狀態就是不會儲存資料 controller、service和dao層本身並不是執行緒安全的, 只是如果只是呼叫裡面的 方法,而且多執行緒呼叫一個例項的方法,會在記憶體中複製變數,這是自己的執行緒的工作記憶體,是安全的。

Dao會操作資料庫Connection, Connection是帶有狀態的, 比如說資料庫事務, Spring的事務管理器使用 Thread local為不同執行緒維護了一套獨立的connection副本, 保證執行緒之間不會互相影響(Spring是如何保證事務 獲取同一個Connection的)

不要在bean中宣告任何有狀態的例項變數或類變數, 如果必須如此, 那麼就使用Thread Local把變數變為執行緒私 有的, 如果bean的例項變數或類變數需要在多個執行緒之間共享, 那麼就只能使用synchronized、lock、CAS等這 些實現執行緒同步的方法了。