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

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

本節(jié)介紹了Servlet對(duì)象池,它是為了支持Servlet規(guī)范SingleThreadModel接口而引入的,它就是一個(gè)棧結(jié)構(gòu),需要時(shí)就pop一個(gè)對(duì)象,使用完就push回去。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Tomcat正常訪問localhost報(bào)404問題解決
這篇文章主要介紹了Tomcat正常訪問localhost報(bào)404問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Tomcat中更改網(wǎng)站根目錄和默認(rèn)頁的配置方法
這篇文章主要介紹了Tomcat中更改網(wǎng)站根目錄和默認(rèn)頁的配置方法,需要的朋友可以參考下2014-05-05
Tomcat8使用cronolog來進(jìn)行Catalina.Out日志分割方法
今天通過本文給大家分享如何使用cronolog來分割catalina.out日志文件,對(duì)Tomcat Catalina.Out日志分割方法感興趣的朋友跟隨小編一起看看吧2021-09-09
解決“Unable to start embedded Tomcat“錯(cuò)誤的完整
在使用Spring Boot開發(fā)應(yīng)用程序時(shí),有時(shí)可能會(huì)遇到"Unable to start embedded Tomcat"的錯(cuò)誤,這可能是由多種原因引起的,本文將詳細(xì)介紹這個(gè)錯(cuò)誤的常見原因以及解決方法,幫助你快速解決問題并順利啟動(dòng)應(yīng)用程序2023-10-10
解決Tomcat?Caused?by:?java.lang.ClassNotFoundException:?ja
這篇文章主要給大家介紹了如何解決Tomcat?Caused?by:?java.lang.ClassNotFoundException:?java.util.logging.Logger的問題,文中有詳細(xì)的原因分析及解決方法,需要的朋友可以參考下2023-10-10

