<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 104,  comments - 34,  trackbacks - 0

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

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

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


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

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

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

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

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

     

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

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

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

     4,不要在Servlet中創建自己的線程來完成某個功能。
      Servlet本身就是多線程的,在Servlet中再創建線程,將導致執行情況復雜化,出現多線程安全問題。

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

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


    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/qfs_v/archive/2008/07/15/2652097.aspx

    posted on 2009-09-08 15:52 末日風情 閱讀(506) 評論(0)  編輯  收藏 所屬分類: JSP基礎
    <2009年9月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产精品lv| 亚洲综合国产一区二区三区| 亚洲欧洲国产经精品香蕉网| 久久久久免费看黄a级试看 | 天天影院成人免费观看| 久久久久亚洲AV无码观看| 91香蕉国产线在线观看免费| 亚洲激情中文字幕| 最近中文字幕高清免费中文字幕mv | 一级成人a做片免费| 2048亚洲精品国产| 国产午夜成人免费看片无遮挡| 激情97综合亚洲色婷婷五| 最近免费mv在线观看动漫| 亚洲一区二区三区电影| 免费电视剧在线观看| 香蕉视频亚洲一级| 亚洲情侣偷拍精品| 午夜网站在线观看免费完整高清观看| 亚洲成a人片77777老司机| 成人免费视频69| 亚洲AV无码成人精品区狼人影院 | 四虎国产精品免费久久影院| 国产精品视频全国免费观看| 国产亚洲精品岁国产微拍精品| 嫩草影院在线播放www免费观看| 亚洲国产高清视频在线观看| AV片在线观看免费| 久久WWW免费人成—看片| 亚洲一二成人精品区| 大学生a级毛片免费观看| 一级毛片免费不卡| 亚洲欧洲综合在线| 四虎影视永久免费视频观看| 野花香高清在线观看视频播放免费| 亚洲免费视频播放| 亚洲人成无码网站| 啦啦啦www免费视频| 久久精品私人影院免费看| 亚洲精品无码av片| 亚洲AV无码国产精品色午友在线|