日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Servlet多線程的相關(guān)問題淺析

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

成都創(chuàng)新互聯(lián)公司,專注為中小企業(yè)提供官網(wǎng)建設(shè)、營銷型網(wǎng)站制作、成都響應(yīng)式網(wǎng)站建設(shè)公司、展示型做網(wǎng)站、網(wǎng)站建設(shè)等服務(wù),幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營銷推廣問題。

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

1、實現(xiàn) SingleThreadModel

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

 
 
 
  1. Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
  2.      …………

2、同步對共享數(shù)據(jù)的操作

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

 
 
 
  1. …………
  2. Public class Concurrent Test extends HttpServlet { …………
  3. Username = request.getParameter ("username"); 
  4. Synchronized (this){
  5. Output = response.getWriter (); 
  6. Try {
  7. Thread. Sleep (5000);
  8. } Catch (Interrupted Exception e){}
  9. output.println("用戶名:"+Username+"
  10. "); 
  11. }
  12. }

3、避免使用實例變量

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

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

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

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


網(wǎng)站名稱:Servlet多線程的相關(guān)問題淺析
本文URL:http://m.5511xx.com/article/dpjpdhc.html