成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Servlet容器的安全多線程問題有哪些

本篇內(nèi)容介紹了“Servlet容器的安全多線程問題有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)建站是一家專業(yè)從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司。作為專業(yè)的建站公司,創(chuàng)新互聯(lián)建站依托的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營銷型網(wǎng)站及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!

一,Servlet容器如何同時(shí)處理多個(gè)請求。

Servlet采用多線程來處理多個(gè)請求同時(shí)訪問,Servelet容器維護(hù)了一個(gè)線程池來服務(wù)請求。

線程池實(shí)際上是等待執(zhí)行代碼的一組線程叫做工作者線程(WorkerThread),Servlet容器使用一個(gè)調(diào)度線程來管理工作者線程(DispatcherThread)。

當(dāng)容器收到一個(gè)訪問Servlet的請求,調(diào)度者線程從線程池中選出一個(gè)工作者線程,將請求傳遞給該線程,然后由該線程來執(zhí)行Servlet的service方法。

當(dāng)這個(gè)線程正在執(zhí)行的時(shí)候,容器收到另外一個(gè)請求,調(diào)度者線程將從池中選出另外一個(gè)工作者線程來服務(wù)新的請求,容器并不關(guān)系這個(gè)請求是否訪問的是同一個(gè)Servlet還是另外一個(gè)Servlet。

當(dāng)容器同時(shí)收到對(duì)同一Servlet的多個(gè)請求,那這個(gè)Servlet的service方法將在多線程中并發(fā)的執(zhí)行。

二,Servlet容器默認(rèn)采用單實(shí)例多線程的方式來處理請求,這樣減少產(chǎn)生Servlet實(shí)例的開銷,提升了對(duì)請求的響應(yīng)時(shí)間。對(duì)于Tomcat可以在server.xml中通過<Connector>元素設(shè)置線程池中線程的數(shù)目。

就實(shí)現(xiàn)來說:

調(diào)度者線程類所擔(dān)負(fù)的責(zé)任如其名字,該類的責(zé)任是調(diào)度線程,只需要利用自己的屬性完成自己的責(zé)任。所以該類是承擔(dān)了責(zé)任的,并且該類的責(zé)任又集中到***的單體對(duì)象中。

而其他對(duì)象又依賴于該特定對(duì)象所承擔(dān)的責(zé)任,我們就需要得到該特定對(duì)象。那該類就是一個(gè)單例模式的實(shí)現(xiàn)了。

三,如何開發(fā)線程安全的Servlet

1,變量的線程安全:這里的變量指字段和共享數(shù)據(jù)(如表單參數(shù)值)。

a,將參數(shù)變量本地化。多線程并不共享局部變量.所以我們要盡可能的在servlet中使用局部變量。

例如:

Stringuser="";  user=request.getParameter("user");

b,使用同步塊Synchronized,防止可能異步調(diào)用的代碼塊。這意味著線程需要排隊(duì)處理。

在使用同板塊的時(shí)候要盡可能的縮小同步代碼的范圍,不要直接在sevice方法和響應(yīng)方法上使用同步,這樣會(huì)嚴(yán)重影響性能。

2,屬性的線程安全:ServletContext,HttpSession,ServletRequest對(duì)象中屬性

ServletContext:(線程是不安全的)

ServletContext是可以多線程同時(shí)讀/寫屬性的,線程是不安全的。要對(duì)屬性的讀寫進(jìn)行同步處理或者進(jìn)行深度Clone()。

所以在Servlet上下文中盡可能少量保存會(huì)被修改(寫)的數(shù)據(jù),可以采取其他方式在多個(gè)Servlet中共享,比方我們可以使用單例模式來處理共享數(shù)據(jù)。

HttpSession:(線程是不安全的)

HttpSession對(duì)象在用戶會(huì)話期間存在,只能在處理屬于同一個(gè)Session的請求的線程中被訪問,因此Session對(duì)象的屬性訪問理論上是線程安全的。

當(dāng)用戶打開多個(gè)同屬于一個(gè)進(jìn)程的瀏覽器窗口,在這些窗口的訪問屬于同一個(gè)Session,會(huì)出現(xiàn)多次請求,需要多個(gè)工作線程來處理請求,可能造成同時(shí)多線程讀寫屬性。

這時(shí)我們需要對(duì)屬性的讀寫進(jìn)行同步處理:使用同步塊Synchronized和使用讀/寫器來解決。

ServletRequest:(線程是安全的)

對(duì)于每一個(gè)請求,由一個(gè)工作線程來執(zhí)行,都會(huì)創(chuàng)建有一個(gè)新的ServletRequest對(duì)象,所以ServletRequest對(duì)象只能在一個(gè)線程中被訪問。ServletRequest是線程安全的。

注意:ServletRequest對(duì)象在service方法的范圍內(nèi)是有效的,不要試圖在service方法結(jié)束后仍然保存請求對(duì)象的引用。

3,使用同步的集合類:

使用Vector代替ArrayList,使用Hashtable代替HashMap。

4,不要在Servlet中創(chuàng)建自己的線程來完成某個(gè)功能。

Servlet本身就是多線程的,在Servlet中再創(chuàng)建線程,將導(dǎo)致執(zhí)行情況復(fù)雜化,出現(xiàn)多線程安全問題。

5,在多個(gè)servlet中對(duì)外部對(duì)象(比方文件)進(jìn)行修改操作一定要加鎖,做到互斥的訪問。

四,SingleThreadModel接口

javax.servlet.SingleThreadModel接口是一個(gè)標(biāo)識(shí)接口,如果一個(gè)Servlet實(shí)現(xiàn)了這個(gè)接口,那Servlet容器將保證在一個(gè)時(shí)刻僅有一個(gè)線程可以在給定的servlet實(shí)例的service方法中執(zhí)行。將其他所有請求進(jìn)行排隊(duì)。

服務(wù)器可以使用多個(gè)實(shí)例來處理請求,代替單個(gè)實(shí)例的請求排隊(duì)帶來的效益問題。服務(wù)器創(chuàng)建一個(gè)Servlet類的多個(gè)Servlet實(shí)例組成的實(shí)例池,對(duì)于每個(gè)請求分配Servlet實(shí)例進(jìn)行響應(yīng)處理,之后放回到實(shí)例池中等待下此請求。這樣就造成并發(fā)訪問的問題。

此時(shí),局部變量(字段)也是安全的,但對(duì)于全局變量和共享數(shù)據(jù)是不安全的,需要進(jìn)行同步處理。而對(duì)于這樣多實(shí)例的情況SingleThreadModel接口并不能解決并發(fā)訪問問題。

SingleThreadModel接口在servlet規(guī)范中已經(jīng)被廢棄了。

“Servlet容器的安全多線程問題有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站標(biāo)題:Servlet容器的安全多線程問題有哪些
本文來源:http://jinyejixie.com/article4/jpdioe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、商城網(wǎng)站、電子商務(wù)、用戶體驗(yàn)、企業(yè)建站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
甘肃省| 清新县| 福海县| 无锡市| 星子县| 兴仁县| 施甸县| 海晏县| 治多县| 永靖县| 嵩明县| 济阳县| 霍邱县| 磐石市| 花莲市| 新平| 玛沁县| 慈利县| 盐城市| 珲春市| 哈尔滨市| 沂源县| 吉安县| 贡嘎县| 阳谷县| 麻栗坡县| 喀喇| 金山区| 湛江市| 精河县| 孝义市| 桃江县| 石棉县| 班玛县| 察哈| 徐水县| 富裕县| 固镇县| 安徽省| 休宁县| 光泽县|