單例多例需要搞明白兩個問題:
1.什麼是單例多例
所謂單例就是所有的請求只有乙個物件來處理,比如常用的service和dao層的物件都是通過單例建立 的,多例就是每個請求都有乙個新的物件來處理,比如action;
單例多例都屬於物件模式,單例在整個系統中只有乙個,多例存在多個例項;
對外都不提供私有方法,即構造方法私有化;
單例
/** 懶漢式,執行呼叫時才建立,第一次建立
*/public
class
lhan
;public
static
synchronized lhan getinsatance()
return instance;}}
/** 餓漢式,呼叫前,載入時就呼叫,第一次使用
*/public
class
ehan
;private
static ehan getinstance()
}/**
* 雙檢鎖模式
*/public
class
doublecheck
;public
static doublecheck getinstance()
}}return instance;
}}
2.如何產生單例多例
在通用的ssh中,單例在spring中是預設的,如果要產生多例,則在配置檔案的bean中新增scope=「prototype」;
之所以用單例,是因為沒必要每個請求都新建乙個物件,這樣既浪費cpu又浪費記憶體;
之所以用多例,是為了防止併發問題;即乙個請求改變了物件的狀態,此時物件又處理另乙個請求,而之前請求對物件狀態的改變導致了物件對另乙個請求做了錯誤的處理;
用單例和多例的標準只有乙個:
當物件含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;
4. 何時用單例?何時用多例?
對於struts2來說,action必須用多例,因為action本身含有請求引數的值,即可改變的狀態;
而對於struts1來說,action則可用單例,因為請求引數的值是放在actionform中,而非action中的;
另外要說一下,並不是說service或dao一定是單例,標準同第3點所講的,就曾見過有的service中也包含了可改變的狀態,同時執行方法也依賴該狀態,但一樣用的單例,這樣就會出現隱藏的bug,而併發的bug通常很難重現和查詢;
引用自:
單例和多例的區別
單例模式的物件在整個系統中只有乙份,也就是只有乙個物件,而多例模式可以有多個。在記憶體當中體現為單例模式只占用乙份儲存空間,節約伺服器資源而多例模式每次例項化都要新開闢一快記憶體 單例模式記憶體分析可參考 在應用上單例模式多用於多執行緒類業務如購票系統 秒殺系統,通過物件鎖確保物件全域性唯一,防止程...
單例和多例的區別
所謂單bai例就是所有的請求都用乙個物件來處理,du比如我們常用的service和dao層的zhi對dao象通常都是單例的,而多例則指每個請求用乙個新的物件來處理,比如action 1.單例模式和多例模式屬於物件模式。2.單例模式的物件在整個系統中只有乙份,多例模式可以有多個例項。3.它們都不對外提...
單例和多例
單例模式 兩種寫法 一.懶漢式 最簡單的寫法 怕多執行緒 中間的寫法 無法實現多執行緒 雙鎖的寫法 實現了執行緒安全,並保留了多執行緒。特點 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。public class user private ...