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

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

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

    posts - 14,  comments - 37,  trackbacks - 0
    簡單的說, servlet絕對不是線程安全的, 所以, 盡量比聲明servlet的屬性, 雖然可以得到解決辦法, 但是性能上都不好的.
    如下的文字摘自好多的網站了.
    鏈接列表:
    http://www.itisedu.com/phrase/200603091005185.html
    http://developer.51cto.com/art/200610/32858.htm
    http://www.it-accp.com/news_read.asp?id=75&hangclassname=%E5%AD%A6%E4%B9%A0%E5%9B%AD%E5%9C%B0
    http://blog.csdn.net/Explorering/archive/2006/10/11/1330744.aspx

    Servlet生命周期

      裝載Servlet。這項操作一般是動態執行的。然而,Server通常會提供一個管理的選項,用于在Server啟動時強制裝載和初始化特定的Servlet。

      Server創建一個Servlet的實例

      Server調用Servlet的init()方法

      一個客戶端的請求到達Server

      Server創建一個請求對象

      Server創建一個響應對象

      Server激活Servlet的service()方法,傳遞請求和響應對象作為參數

      service()方法獲得關于請求對象的信息,處理請求,訪問其他資源,獲得需要的信息

      service()方法使用響應對象的方法,將響應傳回Server,最終到達客戶端。service()方法可能激活其它方法以處理請求,如doGet()或doPost()或程序員自己開發的新的方法

      對于更多的客戶端請求,Server創建新的請求和響應對象,仍然激活此Servlet的 service()方法,將這兩個對象作為參數傳遞給它。如此重復以上的循環,但無需再次調用init()方法。一般Servlet只初始化一次 ,當Server不再需要Servlet時(一般當Server關閉時),Server調用Servlet的Destroy()方法。

     

    Servlet體系結構是建立在Java多線程機制之上的,它的生命周期是由Web容器負責的。當客戶端第一次請求某個Servlet時, Servlet容器將會根據web.xml配置文件實例化這個Servlet類。當有新的客戶端請求該Servlet時,一般不會再實例化該 Servlet類,也就是有多個線程在使用這個實例。 這樣,當兩個或多個線程同時訪問同一個Servlet時,可能會發生多個線程同時訪問同一資源的情況,數據可能會變得不一致。所以在用Servlet構建的Web應用時如果不注意線程安全的問題,會使所寫的Servlet程序有難以發現的錯誤。

    實例變量不正確的使用是造成Servlet線程不安全的主要原因。下面針對該問題給出了三種解決方案并對方案的選取給出了一些參考性的建議。

      1、實現 SingleThreadModel 接口

       該接口指定了系統如何處理對同一個Servlet的調用。如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法將不 會有兩個線程被同時執行,當然也就不存在線程安全的問題。這種方法只要將前面的Concurrent Test類的類頭定義更改為:

    Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
         …………
    }

      2、同步對共享數據的操作

      使用synchronized 關鍵字能保證一次只有一個線程可以訪問被保護的區段,在本論文中的Servlet可以通過同步塊操作來保證線程的安全。同步后的代碼如下:

    …………
    Public class Concurrent Test extends HttpServlet { …………
    Username = request.getParameter ("username");
    Synchronized (this){
    Output = response.getWriter ();
    Try {
    Thread. Sleep (5000);
    } Catch (Interrupted Exception e){}
    output.println("用戶名:"+Username+"
    ");
    }
    }
    }

      3、避免使用實例變量

      本實例中的線程安全問題是由實例變量造成的,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的。

      修正上面的Servlet代碼,將實例變量改為局部變量實現同樣的功能,代碼如下:

    ……
    Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse
    Response) throws ServletException, IOException {
    Print Writer output;
    String username;
    Response.setContentType ("text/html; charset=gb2312");
    ……
    }
    }

       對上面的三種方法進行測試,可以表明用它們都能設計出線程安全的Servlet程序。但是,如果一個Servlet實現了 SingleThreadModel接口,Servlet引擎將為每個新的請求創建一個單獨的Servlet實例,這將引起大量的系統開銷。 SingleThreadModel在Servlet2.4中已不再提倡使用;同樣如果在程序中使用同步來保護要使用的共享的數據,也會使系統的性能大大 下降。這是因為被同步的代碼塊在同一時刻只能有一個線程執行它,使得其同時處理客戶請求的吞吐量降低,而且很多客戶處于阻塞狀態。另外為保證主存內容和線 程的工作內存中的數據的一致性,要頻繁地刷新緩存,這也會大大地影響系統的性能。所以在實際的開發中也應避免或最小化 Servlet 中的同步代碼;在Serlet中避免使用實例變量是保證Servlet線程安全的最佳選擇。從Java 內存模型也可以知道,方法中的臨時變量是在棧上分配空間,而且每個線程都有自己私有的棧空間,所以它們不會影響線程的安全。

    posted on 2007-07-10 09:34 冰封的愛 閱讀(357) 評論(0)  編輯  收藏 所屬分類: J2EE
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久精品国产亚洲精品| 免费中文字幕在线| 中文字幕亚洲综合久久| 国产成人无码区免费网站| 亚洲日本中文字幕一区二区三区 | 亚洲一卡2卡3卡4卡5卡6卡| 最近免费字幕中文大全视频| 97亚洲熟妇自偷自拍另类图片| 99re在线这里只有精品免费| 久久亚洲精品成人av无码网站| 中国人xxxxx69免费视频| 亚洲乱人伦精品图片| 最近最新中文字幕完整版免费高清| 久久国产亚洲精品| 国产精品jizz在线观看免费| 男女超爽视频免费播放| 亚洲一区二区三区无码影院| 中文在线日本免费永久18近| 亚洲国产美国国产综合一区二区| 日本在线看片免费人成视频1000| 亚洲一区二区三区国产精品无码 | 一区二区三区免费视频播放器| 国产亚洲精品国产| 亚欧色视频在线观看免费| 97久久国产亚洲精品超碰热| 成人爱做日本视频免费| 两个人看的www免费高清 | 亚洲精品无码日韩国产不卡?V| 久久免费99精品国产自在现线| 久久久久久久久亚洲| 亚洲人成电影网站免费| 男人免费视频一区二区在线观看| 亚洲日韩aⅴ在线视频| 狼群影院在线观看免费观看直播| 亚洲老熟女五十路老熟女bbw| 国产成人亚洲精品影院| 97视频免费观看2区| 国产亚洲福利一区二区免费看 | 亚洲欧洲国产成人精品| 国产大片91精品免费看3| 免费污视频在线观看|