tomcat中Servlet對象池介紹及如何使用
tomcat中Servlet對象池
Servlet在不實(shí)現(xiàn)SingleThreadModel的情況下運(yùn)行時是以單個實(shí)例模式,如下圖,這種情況下,Wrapper容器只會通過反射實(shí)例化一個Servlet對象,對應(yīng)此Servlet的所有客戶端請求都會共用此Servlet對象,而對于多個客戶端請求tomcat會使用多線程處理,所以應(yīng)該保證此Servlet對象的線程安全,多個線程不管執(zhí)行順序如何都能保證執(zhí)行結(jié)果的正確性。例如剛做web應(yīng)用開發(fā)時可能會犯的一個錯誤:在某個Servlet中使用成員變量累加去統(tǒng)計(jì)訪問次數(shù),這就存在線程安全問題。

為了支持一個Servlet對象對應(yīng)一個線程,Servlet規(guī)范提出了一個SingleThreadModel接口,tomcat容器必須要完成的機(jī)制是:如果某個Servlet類實(shí)現(xiàn)了SingleThreadModel接口則要保證一個線程獨(dú)占一個Servlet對象。假如線程1正在使用Servlet對象1,則線程2只能用Servlet對象2。
針對SingleThreadModel模式,tomcat的Wrapper容器使用了對象池策略,Wrapper容器會有一個Servlet堆保存若干個該Servlet對象,當(dāng)需要該Servlet對象時從堆中pop一個對象,而當(dāng)用完后則push回堆中。Wrapper容器中最多可以有20個該Servlet對象,例如xxxServlet類的對象池,已經(jīng)有20個線程占用了20個對象,那么第21個線程執(zhí)行時就會阻塞等待,直到對象池中有可用的對象才繼續(xù)執(zhí)行。
整個流程如下圖所示,某個線程處理客戶端請求,它首先嘗試從Servlet對象池中獲取Servlet對象,此時如果對象池有可用對象則直接返回一個對象,如果不夠使用則繼續(xù)實(shí)例化Servlet對象并push進(jìn)對象池,但Servlet對象的總數(shù)量必須保證在20個以內(nèi),如果20個Servlet對象都被其他線程使用了,那么就必須要等到其他線程用完放回后才能獲取,此時該線程會一直阻塞等待。從對象池中獲取到Servlet對象后則調(diào)用Servlet對象的service方法對客戶端請求進(jìn)行處理,處理完后再將Servlet對象放回對象池中。

本節(jié)介紹了Servlet對象池,它是為了支持Servlet規(guī)范SingleThreadModel接口而引入的,它就是一個棧結(jié)構(gòu),需要時就pop一個對象,使用完就push回去。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Eclipse啟動Tomcat后無法訪問項(xiàng)目解決辦法
這篇文章主要介紹了Eclipse啟動Tomcat后無法訪問項(xiàng)目解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04
IntelliJ?IDEA中配置Tomcat超詳細(xì)教程
這篇文章主要介紹了IntelliJ?IDEA中配置Tomcat超詳細(xì)教程,需要的朋友可以參考下2022-08-08
解決tomcat出現(xiàn):java.lang.IllegalStateException:無輸出目錄問題
這篇文章主要介紹了解決tomcat出現(xiàn):java.lang.IllegalStateException:無輸出目錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Tomcat6.0與windows 2003 server 的IIS服務(wù)器集成
本例主要講解Tomcat6.0與windows 2003 server 的IIS服務(wù)器集成的問題,用到的工具版 本如下:jdk是6.0、Tomcat 6.0、windows 2003 server 的IIS。2009-08-08

