1. 程式人生 > 實用技巧 >單例和多例的區別

單例和多例的區別

所謂單bai例就是所有的請求都用一個物件來處理,du比如我們常用的service和dao層的zhi對dao象通常都是單例的,而多例則指每個請求用一個新的物件來處理,比如action;

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

1. 單例模式和多例模式屬於物件模式。
2. 單例模式的物件在整個系統中只有一份,多例模式可以有多個例項。
3. 它們都不對外提供構造方法,即構造方法都為私有。

二、為什麼用單例、多例

之所以用單例,是因為沒必要每個請求都新建一個物件,這樣子既浪費CPU又浪費記憶體;
之所以用多例,是為了防止併發問題;即一個請求改變了物件的狀態,此時物件又處理另一個請求,而之前請求對物件狀態的改變導致了物件對另一個請求做了錯誤的處理;

三、由Spring管理的物件模式

由Spring管理的物件,預設都是單例的!並且,都是餓漢式的單例模式。
在配置<bean>節點時,可以新增scope屬性其是否單例,當取值為singleton時表示單例,該值也是預設值,當取值為prototype時表示非單例:

<bean id="user" 
    class="cn.tedu.spring.User"
    scope="prototype"></bean>

在單例模式的基礎之上,還可以通過lazy-init屬性配置它是否為懶漢式的單例模式,預設值為false,即非懶漢式,也就是餓漢式的單例模式,當取值為true

時,表示懶漢式的單例模式:

<bean id="user" 
    class="cn.tedu.spring.User"
    scope="singleton"
    lazy-init="true"></bean>

四、單例模式舉例

第一種:懶漢式(執行緒不安全,加上synchronized後執行緒安全)

public class Singleton {
    private static Singleton instance;
    private Singleton (){}

    public static synchronized  Singleton getInstance() {
    
if (instance == null) { instance = new Singleton(); } return instance; } }

第二種:餓漢式(執行緒安全)

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton (){}
    public static Singleton getInstance() {
    return instance;
    }
}