2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

servlet 多線程安全

 dingdang 2009-04-25
一,servlet容器如何同時處理多個請求。

Servlet采用多線程來處理多個請求同時訪問,Servelet容器維護(hù)了一個線程池來服務(wù)請求。
線程池實(shí)際上是等待執(zhí)行代碼的一組線程叫做工作者線程(Worker Thread),Servlet容器使用一個調(diào)度線程來管理工作者線程(Dispatcher Thread)。

當(dāng)容器收到一個訪問Servlet的請求,調(diào)度者線程從線程池中選出一個工作者線程,將請求傳遞給該線程,然后由該線程來執(zhí)行Servlet的service方法。
當(dāng)這個線程正在執(zhí)行的時候,容器收到另外一個請求,調(diào)度者線程將從池中選出另外一個工作者線程來服務(wù)新的請求,容器并不關(guān)系這個請求是否訪問的是同一個Servlet還是另外一個Servlet。
當(dāng)容器同時收到對同一Servlet的多個請求,那這個Servlet的service方法將在多線程中并發(fā)的執(zhí)行。


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

就實(shí)現(xiàn)來說:
  調(diào)度者線程類所擔(dān)負(fù)的責(zé)任如其名字,該類的責(zé)任是調(diào)度線程,只需要利用自己的屬性完成自己的責(zé)任。所以該類是承擔(dān)了責(zé)任的,并且該類的責(zé)任又集中到唯一的單體對象中。
而其他對象又依賴于該特定對象所承擔(dān)的責(zé)任,我們就需要得到該特定對象。那該類就是一個單例模式的實(shí)現(xiàn)了。

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

  a,將 參數(shù)變量 本地化。多線程并不共享局部變量.所以我們要盡可能的在servlet中使用局部變量。
   例如:String user = "";
         user = request.getParameter("user");

  b,使用同步塊Synchronized,防止可能異步調(diào)用的代碼塊。這意味著線程需要排隊處理。
  在使用同板塊的時候要盡可能的縮小同步代碼的范圍,不要直接在sevice方法和響應(yīng)方法上使用同步,這樣會嚴(yán)重影響性能。

 

 2,屬性的線程安全:ServletContext,HttpSession,ServletRequest對象中屬性
  ServletContext:(線程是不安全的)
   ServletContext是可以多線程同時讀/寫屬性的,線程是不安全的。要對屬性的讀寫進(jìn)行同步處理或者進(jìn)行深度Clone()。
   所以在Servlet上下文中盡可能少量保存會被修改(寫)的數(shù)據(jù),可以采取其他方式在多個Servlet中共享,比方我們可以使用單例模式來處理共享數(shù)據(jù)。
  HttpSession:(線程是不安全的)
   HttpSession對象在用戶會話期間存在,只能在處理屬于同一個Session的請求的線程中被訪問,因此Session對象的屬性訪問理論上是線程安全的。
   當(dāng)用戶打開多個同屬于一個進(jìn)程的瀏覽器窗口,在這些窗口的訪問屬于同一個Session,會出現(xiàn)多次請求,需要多個工作線程來處理請求,可能造成同時多線程讀寫屬性。
   這時我們需要對屬性的讀寫進(jìn)行同步處理:使用同步塊Synchronized和使用讀/寫器來解決。

  ServletRequest:(線程是安全的)
   對于每一個請求,由一個工作線程來執(zhí)行,都會創(chuàng)建有一個新的ServletRequest對象,所以ServletRequest對象只能在一個線程中被訪問。ServletRequest是線程安全的。
   注意:ServletRequest對象在service方法的范圍內(nèi)是有效的,不要試圖在service方法結(jié)束后仍然保存請求對象的引用。

 3,使用同步的集合類:
  使用Vector代替ArrayList,使用Hashtable代替HashMap。

 4,不要在Servlet中創(chuàng)建自己的線程來完成某個功能。
  Servlet本身就是多線程的,在Servlet中再創(chuàng)建線程,將導(dǎo)致執(zhí)行情況復(fù)雜化,出現(xiàn)多線程安全問題。

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

四,SingleThreadModel接口
 javax.servlet.SingleThreadModel接口是一個標(biāo)識接口,如果一個Servlet實(shí)現(xiàn)了這個接口,那Servlet容器將保證在一個時刻僅有一個線程可以在給定的servlet實(shí)例的service方法中執(zhí)行。將其他所有請求進(jìn)行排隊。
 服務(wù)器可以使用多個實(shí)例來處理請求,代替單個實(shí)例的請求排隊帶來的效益問題。服務(wù)器創(chuàng)建一個Servlet類的多個Servlet實(shí)例組成的實(shí)例池,對于每個請求分配Servlet實(shí)例進(jìn)行響應(yīng)處理,之后放回到實(shí)例池中等待下此請求。這樣就造成并發(fā)訪問的問題。
 此時,局部變量(字段)也是安全的,但對于全局變量和共享數(shù)據(jù)是不安全的,需要進(jìn)行同步處理。而對于這樣多實(shí)例的情況SingleThreadModel接口并不能解決并發(fā)訪問問題。
 
 SingleThreadModel接口在servlet規(guī)范中已經(jīng)被廢棄了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多