Spring與執行緒安全

2022-09-22 20:33:05 字數 846 閱讀 6306

spring作為一個ioc/di容器,幫助我們管理了許許多多的“bean”。但其實,spring並沒***這些物件的執行緒安全,需要由開發者自己編寫解決執行緒安全問題的**。

spring對每個bean提供了一個scope屬性來表示該bean的作用域。它是bean的生命週期。例如,一個scope為singleton的bean,在第一次被注入時,會建立為一個單例物件,該物件會一直被複用到應用結束。

我們交由spring管理的大多數物件其實都是一些無狀態的物件,這種不會因為多執行緒而導致狀態被破壞的物件很適合spring的預設scope,每個單例的無狀態物件都是執行緒安全的(也可以說只要是無狀態的物件,不管單例多例都是執行緒安全的,不過單例畢竟節省了不斷建立物件與gc的開銷)。

有人可能會認為,我使用request作用域不就可以避免每個請求之間的安全問題了嗎?這是完全錯誤的,因為controller預設是單例的,一個http請求是會被多個執行緒執行的,這就又回到了執行緒的安全問題。當然,你也可以把controller的scope改成prototype,實際上struts2就是這麼做的,但有一點要注意,spring mvc對請求的攔截粒度是基於每個方法的,而struts2是基於每個類的,所以把controller設為多例將會頻繁的建立與**物件,嚴重影響到了效能。

通過閱讀上文其實已經說的很清楚了,spring根本就沒有對bean的多執行緒安全問題做出任何保證與措施。對於每個bean的執行緒安全問題,根本原因是每個bean自身的設計。不要在bean中宣告任何有狀態的例項變數或類變數,如果必須如此,那麼就使用threadlocal把變數變為執行緒私有的,如果bean的例項變數或類變數需要在多個執行緒之間共享,那麼就只能使用synchronized、lock、cas等這些實現執行緒同步的方法了。

spring mvc 安全

1,使用 spring form 標籤 防 csrf 攻擊 2,標明請求方法 requestmethod get requestmethod...

Spring Boot 安全

官方文件 org springframework boot spring boot starter security enablewebsecurity public class mysecurityconfig extends websecurityconfigureradapter overri...

spring cloud config安全

前面兩篇介紹了spring cloud config服務端和客戶端的簡單配置,本篇介紹如何保護config server及對應config client修改。 保護config server,主要是使用spring security進行最簡單的basic安全認證 也可自定義認證方式,這裡不做擴充套件 配...