1.Servlet是單實例多線程的,具體是怎麼實施這個過程的能夠百度,前輩們已經很具體詳細的寫明白了。多線程
2.Servlet的單實例指的是這個servlet類只被實例化一次,就是第一次請求這個servlet的時候.net
3.Servlet怎麼處理一個請求:線程
①你編寫了一個servlet類對象
②請求到了,須要servlet去處理,這個時候被類被實例化一次(成員變量在堆中開闢內存,臨時變量在棧中開闢內存),獲得了一個servlet實例,它的處理業務的關鍵性代碼和你寫的同樣。blog
③開始處理請求:先把剛纔實例化的servlet的臨時變量,成員變量複製一份,開始一個處理這個請求的線程。事務
4.Servlet的多線程:內存
1)先接着3,④:當第二個請求到了,這個時候不在從新實例化一個servlet,而是複製一份那個實例化的servlet的臨時變量和成員變量,開啓一個新的線程,這個新線程開始處理新請求。作用域
2)多線程,就是多個請求到了,servlet不會從新實例化,只有一個servlet的實例化對象。可是會有一個對應的新線程開啓,線程複製一份servlet實例對象的成員變量和臨時變量,緊接着開始本身的事務處理。servlet
5.因此寫servlet的時候要十分注意成員變量的使用,它是在堆中的,因此你全部請求來的時候,開啓新線程,每一個線程複製過去的成員變量是共享的東西,這個共享就會由於讀取修改在時間上的交錯而產生線程問題,而那些方法內的臨時變量是不會這樣,由於它們在棧中,當超過了做用域(好比你這個變量是在一個方法裏的,你執行完這個方法,它就銷燬了,另外一個線程去複製時,等於說重頭開始。)就失效了。變量
關於堆和棧請參考看下:(權傾刪)http://blog.csdn.net/huozhicheng/article/details/6575960