更新時間:2023-04-20 來源:黑馬程序員 瀏覽量:
Spring bean并沒有可變的狀態(比如Service類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。
不是線程安全的Spring框架中有一個@Scope注解,默認的值就是singleton,單例的。因為一般在spring的bean的中都是注入無狀態的對象,沒有線程安全問題,如果在bean中定義了可修改的成員變量,是要考慮線程安全問題的,可以使用多例或者加鎖來解決。
當多用戶同時請求一個服務時,容器會給每一個請求分配一個線程,這是多個線程會并發執行該請求對應的業務邏輯(成員方法),如果該處理邏輯中有對該單列狀態的修改(體現為該單例的成員屬性),則必須考慮線程同步問題。
Spring框架并沒有對單例bean進行任何多線程的封裝處理。關于單例bean的線程安全和并發問題需要開發者自去搞定。
比如:我們通常在項目中使用的Springbean都是不可可變的狀態(比如Service類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。
如果你的bean有多種狀態的話(比如ViewModel對象),就需要自行保證線程安全。最淺顯的解決辦法就是將多態bean的作用由"singleton"變更為"prototype"。