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

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

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

    posts - 101,  comments - 29,  trackbacks - 0
    先說明幾個概念:
    工作者線程Work Thread:執行代碼的一組線程
    調度線程Dispatcher Thread:每個線程都具有分配給它的線程優先級,線程是根據優先級調度執行的
    Servlet采用多線程來處理多個請求同時訪問。servlet依賴于一個線程池來服務請求。線程池實際上是一系列的工作者線程集合。Servlet使用一個調度線程來管理工作者線程.
    當容器收到一個Servlet請求,調度線程從線程池中選出一個工作者線程,將請求傳遞給該工作者線程,然后由該線程來執行Servlet的service方法。當這個線程正在執行的時候,容器收到另外一個請求,調度線程同樣從線程池中選出另一個工作者線程來服務新的請求,容器并不關心這個請求是否訪問的是同一個Servlet.當容器同時收到對同一個Servlet的多個請求的時候,那么這個Servlet的service()方法將在多線程中并發執行。
    Servlet容器默認采用單實例多線程的方式來處理請求,這樣減少產生Servlet實例的開銷,提升了對請求的響應時間,對于Tomcat可以在server.xml中通過<Connector>元素設置線程池中線程的數目
    就實現來說:
    調度者線程類所擔負的責任如其名字,該類的責任是調度線程,只需要利用自己的屬性完成自己的責任。所以該類是承擔了責任的,并且該類的責任又集中到唯一的單體對象中。

    而其他對象又依賴于該特定對象所承擔的責任,我們就需要得到該特定對象。那該類就是一個單例模式的實現了。


    “servlet 可以同時處理多個請求”

    當多個request同時來請求一個servlet時,tomcat的工作原理是會對這多個請求分別創建線程

    但是每個線程拿到的servlet實例是同一個servlet實例(單例模式),這樣的話他們在使用service方法時就會可能出現同時使用,所以如果有需要更改實例狀態(共享成員變量的)語句,就要加上鎖-synchronized關鍵字。


    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中對外部對象(比方文件)進行修改操作一定要加鎖,做到互斥的訪問。

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



    posted on 2012-05-12 00:11 mixer-a 閱讀(2453) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲av无码乱码在线观看野外 | jlzzjlzz亚洲jzjzjz| 美女黄频免费网站| 免费羞羞视频网站| 亚洲国产精品成人午夜在线观看| 97无码免费人妻超级碰碰碰碰 | 中文字幕亚洲专区| 国产裸体美女永久免费无遮挡| 四虎永久免费地址在线观看| 精品韩国亚洲av无码不卡区| 国产美女被遭强高潮免费网站| 香蕉视频在线观看免费| 亚洲色婷婷综合开心网| 免费人成在线观看69式小视频| 亚洲国产女人aaa毛片在线| 99视频有精品视频免费观看| 亚洲精品偷拍无码不卡av| 中文毛片无遮挡高潮免费| 亚洲人成网站18禁止久久影院| 久久久久免费看黄A片APP| 国内精品久久久久影院亚洲| 四虎影在线永久免费观看| 国产精品玖玖美女张开腿让男人桶爽免费看 | 亚洲AV成人片色在线观看高潮 | 美女视频黄a视频全免费网站色| 亚洲欧洲日产国码高潮αv| 热99RE久久精品这里都是精品免费 | 亚洲AV无码一区二区三区在线| 日韩成人免费aa在线看| 免费一级毛片在线播放放视频 | 亚洲av中文无码乱人伦在线r▽| 久久精品免费一区二区| 亚洲第一街区偷拍街拍| 亚洲综合无码精品一区二区三区| 最近中文字幕电影大全免费版| 亚洲日本久久久午夜精品| 免费国产a国产片高清网站| 无码少妇精品一区二区免费动态| 中文字幕在线日亚洲9| 亚洲一区二区女搞男| 中文字幕无码免费久久99|