【轉】 Servlet多線程安全問題

一,servlet容器如何同時處理多個請求java

    Servlet採用多線程來處理多個請求同時訪問,Servelet容器維護了一個線程池來服務請求。該線程池其實是等待執行代碼的一組線程,咱們把它叫作工做者線程(Worker Thread),Servlet容器使用一個調度線程來管理工做者線程(Dispatcher Thread)。瀏覽器

    當容器收到一個訪問Servlet的請求,調度者線程從線程池中選出一個工做者線程,將請求傳遞給該線程,而後由該線程來執行Servlet的service方法。當這個線程正在執行的時候,容器收到另一個請求,調度者線程將從池中選出另一個工做者線程來服務新的請求,容器並不關心這個請求是否訪問的是同一個Servlet仍是另一個Servlet。當容器同時收到對同一Servlet的多個請求,那這個Servlet的service方法將在多線程中併發的執行。安全

二,Servlet容器默認採用單實例多線程的方式來處理請求
    這種工做模式能減小產生Servlet實例的開銷,提高了對請求的響應時間。對於Tomcat能夠在server.xml中經過<Connector>元素設置線程池中線程的數目。服務器

三,如何開發線程安全的Servlet                                                                                                                 多線程

  • 變量的線程安全

    這裏的變量指字段和共享數據(如表單參數值)。

  • 將 參數變量 本地化

        多線程並不共享局部變量.因此咱們要儘量的在servlet中使用局部變量。 併發

  • 使用同步塊Synchronized,防止可能異步調用的代碼塊

        這意味着線程須要排隊處理。在使用同步塊的時候要儘量的縮小同步代碼的範圍,不要直接在sevice方法和響應方法上使用同步,這樣會嚴重影響性能。 異步

  • 屬性的線程安全

        ServletContext:線程不安全
        ServletContext是能夠多線程同時讀/寫屬性的,線程是不安全的,因此要對屬性的讀寫進行同步處理或者進行深度Clone()。 在ServletContext中儘量少許保存會被修改(寫)的數據,能夠採起其餘方式在多個Servlet中共享,比方咱們可使用單例模式來處理共享數據。性能

         HttpSession:線程不安全
        當用戶打開多個同屬於一個進程的瀏覽器窗口,在這些窗口的訪問屬於同一個Session,會出現屢次請求,須要多個工做線程來處理請求,可能形成同時多線程讀寫屬性。這時咱們須要對屬性的讀寫進行同步處理:使用同步塊Synchronized和使用讀/寫器來解決。spa

          ServletRequest:線程安全
          對於每個請求,由一個工做線程來執行,而且會建立有一個新的ServletRequest對象,因此ServletRequest對象只能在一個線程中被訪問。 所以ServletRequest是線程安全的。
           注意:ServletRequest對象只在service方法的範圍內是有效,不要試圖在service方法結束後仍然保存請求對象的引用。線程

  • 使用線程安全或作了同步的集合類 
      使用Vector代替ArrayList,使用Hashtable代替HashMap, 或者使用Synchronized開頭的集合類

  • 不要在Servlet中建立本身的線程來完成某個功能。
      Servlet自己就是多線程的,在Servlet中再建立線程,將致使執行狀況複雜化,出現多線程安全問題。

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

  • SingleThreadModel接口

         javax.servlet.SingleThreadModel接口是一個標識接口,若是一個Servlet實現了這個接口,那Servlet容器將保證在一個時刻僅有一個線程能夠在給定的servlet實例的service方法中執行。將其餘全部請求進行排隊。服務器可使用多個實例來處理請求,代替單個實例的請求排隊帶來的效益問題。服務器建立一個Servlet類的多個Servlet實例組成的實例池,對於每一個請求分配Servlet實例進行響應處理,以後放回到實例池中等待下此請求。這會形成新的併發訪問的問題。 SingleThreadModel接口在servlet規範中已經被廢棄了

相關文章
相關標籤/搜索