當前位置:編程學習大全網 - 編程語言 - 請教各位大神,通常javaweb都是單例多線程的嗎

請教各位大神,通常javaweb都是單例多線程的嗎

舉個栗子

妳用杯子喝可樂,喝完了不刷,繼續去倒果汁喝,就是單例。

妳用杯子喝可樂,直接扔了杯子,換個杯子去倒果汁喝,就是多例。

數據庫連接池就是單例模式,有且僅有壹個連接池管理者,管理多個連接池對象。

1. 什麽是單例多例:

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

2. 如何產生單例多例:

在通用的SSH中,單例在spring中是默認的,如果要產生多例,則在配置文件的bean中添加scope="prototype";

3. 為什麽用單例多例:

之所以用單例,是因為沒必要每個請求都新建壹個對象,這樣子既浪費CPU又浪費內存;

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

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

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

單例其實就在內存中該對象只有壹個內存對應地址。無論妳多少個線程訪問那個對象,都是同壹個地址。這樣節省內存

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

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

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

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

  • 上一篇:樹和蜘蛛的故事小學六年級作文
  • 下一篇:顏良培訓編程學校有哪些?
  • copyright 2024編程學習大全網