Spring架構中的單例Beans是安全執行緒的麼__java面試

來源:互聯網
上載者:User

看到這樣一個問題:Spring架構中的單例Beans是安全執行緒的麼。

Spring架構並沒有對單例bean進行任何多線程的封裝處理。關於單例bean的安全執行緒和並發問題需要開發人員自行去搞定。但實際上,大部分的Spring bean並沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是安全執行緒的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證安全執行緒。

最淺顯的解決辦法就是將多態bean的範圍由“singleton”變更為“prototype”。

沒太看懂有狀態和無狀態的bean是什麼意思,於是百度之,獲益匪淺。

以下內容轉載自:懶散狂徒的專欄

在Spring的Bean配置中,存在這樣兩種情況:

    view plain copy   <bean id="testManager" class="com.sw.TestManagerImpl" scope="singleton" />       <bean id="testManager" class="com.sw.TestManagerImpl" scope="prototype" />  

 

 

當然,scope的值不止這兩種,還包括了request,session 等。但用的最多的還是singleton單態,prototype多態。

singleton表示該bean全域只有一個執行個體,Spring中bean的scope預設也是singleton.

prototype表示該bean在每次被注入的時候,都要重新建立一個執行個體,這種情況適用於有狀態的Bean.

對於SSH架構的系統,很少關心這方面,因為我們用到的一般都是singleton. Bean的注入由Spring管理。

對於有狀態的Bean呢。

下面是一個有狀態的Bean

 

    view plain copy   package com.sw;      public class TestManagerImpl implements TestManager{       private User user;            public void deleteUser(User e) throws Exception {           user = e ;           //1           prepareData(e);       }          public void prepareData(User e) throws Exception {           user = getUserByID(e.getId());            //2           .....           //使用user.getId();                       //3           .....           .....       }      }  

 

 

 

如果該Bean配置為singleton,會出現什麼樣的狀況呢。

如果有2個使用者訪問,都調用到了該Bean.

假定為user1,user2

當user1 調用到程式中的1步驟的時候,該Bean的私人變數user被付值為user1

當user1的程式走到2步驟的時候,該Bean的私人變數user被重新付值為user1_create

理想的狀況,當user1走到3步驟的時候,私人變數user應該為user1_create;

但如果在user1調用到3步驟之前,user2開始運行到了1步驟了,由於單態的資源共用,則私人變數user被修改為user2

這種情況下,user1的步驟3用到的user.getId()實際用到是user2的對象。

 

而如果是prototype的話,就不會出現資源共用的問題。

對於SSH來說,Bean的配置是沒錯的,配置為singleton ;實際應該是這個例子不應該用私人變數。這樣就使得這個Bean

由無狀態變成了有狀態Bean.還是應該盡量使用無狀態Bean.如果在程式中出現私人變數,盡量替換為參數。
對於每個訪問私人變數的方法增加變數傳入或者通過ThreadLocal來擷取也是不錯的方法。

 

真正出現上面代碼問題的也是少數,出現的時候,一般是為了圖方便,一個很多方法都要用到的變數,如果都需要用參數的

方式傳遞多麻煩呀,這樣私人變數多好,不用參數那樣醜陋。但是醜陋並不代表不好,以對的,自己習慣的方式編程,才能

盡量避免問題的發生。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.