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

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

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

    Java,J2EE,Weblogic,Oracle

    java項目隨筆
    隨筆 - 90, 文章 - 6, 評論 - 61, 引用 - 0
    數據加載中……

    servlet多線程及線程安全

    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 2010-09-27 10:42 龔椿深 閱讀(769) 評論(0)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV永久无码精品一百度影院| 国产成人免费全部网站| 久久亚洲精品中文字幕无码| 国产JIZZ中国JIZZ免费看| 国产av无码专区亚洲国产精品| 全黄A免费一级毛片| 国产亚洲精品免费视频播放| 亚洲天堂免费在线视频| 亚洲国产精彩中文乱码AV| 永久免费不卡在线观看黄网站| 亚洲AV无码专区在线播放中文| 久久A级毛片免费观看| 亚洲国产成人91精品| 日韩精品无码区免费专区| 亚洲欧洲免费无码| 免费a级毛片大学生免费观看| 精品特级一级毛片免费观看| 奇米影视亚洲春色| 男人j进入女人j内部免费网站 | 亚洲黄色激情视频| 免费鲁丝片一级观看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产日产成人免费视频在线观看 | 亚洲精品免费在线观看| 69av免费观看| 亚洲va中文字幕| 国产成人99久久亚洲综合精品| 9久久免费国产精品特黄| 亚洲一区二区三区高清| 日韩一区二区a片免费观看| 免费看一级毛片在线观看精品视频| 亚洲av成人一区二区三区在线观看 | 亚洲精品无码激情AV| 91香蕉在线观看免费高清| 国产成人亚洲综合网站不卡| 国产又大又粗又硬又长免费| 国产精品美女免费视频观看| 亚洲国产高清美女在线观看| 国产免费av片在线播放| 波多野结衣免费一区视频| 亚洲精品无码久久|