java中單例和多例的區別

來源:互聯網
上載者:User

標籤:單例   多例   區別   線程   

1. 什麼是單例多例:
所謂單例就是所有的請求都用一個對象來處理,比如我們常用的service和dao層的對象通常都是單例的,而多例則指每個請求用一個新的對象來處理,比如action;
2. 如何產生單例多例:
在通用的SSH中,單例在spring中是預設的,如果要產生多例,則在設定檔的bean中添加scope="prototype";
3. 為什麼用單例多例:
之所以用單例,是因為沒必要每個請求都建立一個對象,這樣子既浪費CPU又浪費記憶體;
之所以用多例,是為了防止並發問題;即一個請求改變了對象的狀態,此時對象又處理另一個請求,而之前請求對對象狀態的改變導致了對象對另一個請求做了錯誤的處理;
用單例和多例的標準只有一個:
當對象含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;
4. 何時用單例?何時用多例?
對於struts2來說,action必須用多例,因為action本身含有請求參數的值,即可改變的狀態;
而對於STRUTS1來說,action則可用單例,因為請求參數的值是放在actionForm中,而非action中的;

另外要說一下,並不是說service或dao一定是單例,標準同第3點所講的,就曾見過有的service中也包含了可改變的狀態,同時執行方法也依賴該狀態,但一樣用的單例,這樣就會出現隱藏的BUG,而並發的BUG通常很難重現和尋找;

其實,單例:非static成員變數及static成員變數都是線程不安全, 多例:非static成員變數安全執行緒,但多例static成員變數會有線程不安全情況,這時候我們會不會考慮死結呢?

java中單例和多例的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.