所謂單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; } }