Java的單例和多例

2021-08-09 22:57:17 字數 1688 閱讀 8058

單例多例需要搞明白兩個問題:

1. 什麼是單例多例;

2. 如何產生單例多例;

3. 為什麼要用單例多例

4. 什麼時候用單例,什麼時候用多例;

1. 什麼是單例、多例:

所謂單例就是所有的請求都用乙個物件來處理,應用中只有乙個物件例項。 

一、單例模式和多例模式說明:

1.         單例模式和多例模式屬於物件模式。

2.         單例模式的物件在整個系統中只有乙份,多例模式可以有多個例項。

3.         它們都不對外提供構造方法,即構造方法都為私有。

二、應用舉例

1.         單例模式舉例:

* 餓漢式

public class singleton

public static singleton getinstance()

public static singleton getinstance()

publicstaticmultiton getinstance(intkey)else

}/**

* 獲取1—6之間的隨機數

*/publicvoidgetvalue()

}packagecom.solid.pattern;

/*** 多例模式測試

*@authorsolid**/

publicclasstestmultiton

}2. 如何產生單例、多例:

在通用的ssh中,單例在spring中是預設的,如果要產生多例,則在配置檔案的bean中新增scope=」prototype」;

我就告訴你昨天我得問題你估計就明白了

我沒用scope=」prototype」就出現上面得驗證問題了 連續點提交就這樣

我新增後 不論怎麼點都只會出現乙個驗證提示

3. 為什麼用單例、多例:

之所以用單例,是因為沒必要每個請求都新建乙個物件,這樣子既浪費cpu又浪費記憶體;

之所以用多例,是為了防止併發問題;即乙個請求改變了物件的狀態,此時物件又處理另乙個請求,而之前請求對物件狀態的改變導致了物件對另乙個請求做了錯誤的處理;

用單例和多例的標準只有乙個:

當物件含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;

4. 何時用單例?何時用多例?

對於struts2來說,action必須用多例,因為action本身含有請求引數的值,即可改變的狀態;

而對於struts1來說,action則可用單例,因為請求引數的值是放在actionform中,而非action中的;

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

單例和多例

單例模式 兩種寫法 一.懶漢式 最簡單的寫法 怕多執行緒 中間的寫法 無法實現多執行緒 雙鎖的寫法 實現了執行緒安全,並保留了多執行緒。特點 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。public class user private ...

Java 單例 多例設計模式

單例和多例的設計模式特點就是構造方法被私有化,外部無法直接用 new 例項化。只能通過呼叫類內部提供的靜態方法取得例項。單例設計模式 餓漢式單例設計模式class singleton 定義全域性常量的時候直接例項化 private static final singleton instance ne...

JAVA 單例和多例 生命週期

其中 init method,該方法是由spring容器去執行法人,在建構函式之後執行 destroy method,如果是單例模式,則spring容器關閉或者銷毀的時候,會執行該方法 如果是多例模式,則spring容器不負責銷毀 說明 如果想讓spring容器管理bean的生命週期,那麼該bean...