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