JavaWeb_多個HTTP請求同時訪問怎么處理?

Servlet對并發(fā)的處理

Tomcat容器處理多并發(fā)采用單例模式、多線程處理方式

只要webapp被發(fā)布到web容器中的時候,servlet只會在發(fā)布的時候?qū)嵗淮?,servlet在其生命周期中只有在將項目給移除或服務(wù)器stop的時候才會銷毀,那么一個web項目從發(fā)布到運行只存在一個servlet的實例。

servlet容器中包含有線程池,規(guī)定了線程池當(dāng)中承載線程的數(shù)量

當(dāng)請求到達時,Servlet容器通過調(diào)度線程(Dispatchaer Thread) 調(diào)度它管理下線程池中等待執(zhí)行的線程(Worker Thread)給請求者

出現(xiàn)不同的線程同一時間訪問同一個servlet的時候,其實servlet的對象只有一個,但是由于是tomcat支持多線程的原因,每個客戶端請求執(zhí)行的servlet中的函數(shù)都是在自己所支配的那一小段線程里面執(zhí)行了,也就是說兩個用戶都登陸,都訪問login方法,但是這是有用的是一個servlet但是局部的方法是放在不同的線程里面的。

也就是說,整個過程servlet實例只有一個,供多個線程使用,每次servlet被訪問都會被線程池的操作線程選出并提供一個新的線程進行操作

servlet是線程安全的嗎?

Servlet體系結(jié)構(gòu)是建立在Java多線程機制之上的,它的生命周期是由Web容器負責(zé)的。

當(dāng)客戶端第一次請求某個Servlet時,Servlet容器將會根據(jù)web.xml配置文件實例化這個Servlet類。當(dāng)有新的客戶端請求該Servlet時,一般不會再實例化該Servlet類,也就是有多個線程在使用這個實例。Servlet容器會自動使用線程池等技術(shù)來支持系統(tǒng)的運行

在Serlet中避免使用實例變量是保證Servlet線程安全的最佳選擇。從Java 內(nèi)存模型也可以知道,方法中的臨時變量是在棧上分配空間,而且每個線程都有自己私有的??臻g,所以它們不會影響線程的安全。

Servlet的線程安全問題只有在大量的并發(fā)訪問時才會顯現(xiàn)出來,并且很難發(fā)現(xiàn),因此在編寫Servlet程序時要特別注意。線程安全問題主要是由實例變量造成的,因此在Servlet中應(yīng)避免使用實例變量。如果應(yīng)用程序設(shè)計無法避免使用實例變量,那么使用同步來保護要使用的實例變量,但為保證系統(tǒng)的最佳性能,應(yīng)該同步可用性最小的代碼路徑。

線程安全和不安全的變量:

1、靜態(tài)變量:線程非安全。

靜態(tài)變量即類變量,位于方法區(qū),為所有對象共享,共享一份內(nèi)存,一旦靜態(tài)變量被修改,其他對象均對修改可見,故線程非安全。

2、實例變量:單例模式(只有一個對象實例存在)線程非安全,非單例線程安全。

實例變量為對象實例私有,在虛擬機的堆中分配,若在系統(tǒng)中只存在一個此對象的實例,在多線程環(huán)境下,“猶如”靜態(tài)變量那樣,被某個線程修改后,其他線程對修改均可見,故線程非安全;如果每個線程執(zhí)行都是在不同的對象中,那對象與對象之間的實例變量的修改將互不影響,故線程安全。

3、局部變量:線程安全。

每個線程執(zhí)行時將會把局部變量放在各自棧幀的工作內(nèi)存中,線程間不共享,故不存在線程安全問題。

參考博文:

https://www.cnblogs.com/GtShare/p/8033637.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 0 系列目錄# WEB請求處理 WEB請求處理一:瀏覽器請求發(fā)起處理 WEB請求處理二:Nginx請求反向代理 本...
    七寸知架構(gòu)閱讀 14,246評論 22 189
  • JAVA面試題 1、作用域public,private,protected,以及不寫時的區(qū)別答:區(qū)別如下:作用域 ...
    JA尐白閱讀 1,269評論 1 0
  • Based on Java? Servlet Specification v3.1 [TOC] Servlet和S...
    0x70e8閱讀 1,409評論 0 7
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,665評論 1 32
  • 給閨蜜的一組圖只調(diào)了色微處理了下 還不太會正在逐漸摸索的我呀 要是什么事情都好好做就能做好就好啦 相機是索尼a60...
    朝朝夕夕兮閱讀 402評論 2 3

友情鏈接更多精彩內(nèi)容