單例
- 對象在整個系統中只有一份,所有的請求都用一個對象來處理,如service和dao層的對象一般是單例的。
- 為什么使用單例:因為沒有必要每個請求都新建一個對象的時候,浪費CPU和內存。
多例
- 對象在整個系統中可以有多個實例,每個請求用一個新的對象來處理,如action。
- 為什么使用多例:防止並發問題;即一個請求改變了對象的狀態,此時對象又處理另一個請求,而之前請求對對象的狀態改變導致了對象對另一個請求做了錯誤的處理;
什么情況下使用單例,什么情況下使用多例?
- Struts2中Action必須使用多例,因為action本身含有請求參數的值,即可改變的狀態; 而對於STRUTS1來說,action則可用單例,因為請求參數的值是放在actionForm中,而非action中的;
- 並不是說service或dao一定是單例,就曾見過有的service中也包含了可改變的狀態,同時執行方法也依賴該狀態,如果用單例,會出現隱藏的並發BUG;
- 使用的標准只有一個:含有可改變狀態時用多例,否則用單例。