专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » servlet多线程:在Servlet和JSP中如何实现多线程安全? »正文

servlet多线程:在Servlet和JSP中如何实现多线程安全?

来源: 发布时间:星期六, 2009年2月21日 浏览:0次 评论:0
1.Servlet生命周期
y/v,sJw"EgaServlet生命周期是由Web容器负责,当客户端第次请求Servlet时,容器负责化Servlet,也就是例子化这个Servlet类.以后这个例子就负责客户端请求,般不会再例子化其他Servlet类,也就是有多个线程在使用这个例子.Servlet的所以比CGI效率高就是Servlet是多线程.如果该Servlet被声明为单线程模型话,容器就会维护个例子池,那么将存在多个例子.
_4E6TG9r1A2.Servlet线程安全
%L \a%?!R/O6n3uServlet规范标准已经声明Servlet不是线程安全,所以在开发Servlet时候要注要这个问题.这里以个现实模型来介绍说明问题,先定义个Servlet类,再定义个SmulateMultiThread类和WebContainer类.
kgTJ"J v3a$RJAVA中文站社区门户0SCR j`
import javax.servlet.http.HttpServlet;
UzNU K mVUimport javax.servlet.ServletException;JAVA中文站社区门户 t y v;Nym1V P$u8}
import javax.servlet.http.HttpServletRequest;
luP&v6Uf7~+iS Bimport javax.servlet.http.HttpServletResponse;
%G]N:dTcX G_import java.io.IOException;JAVA中文站社区门户m,W i$A4HMD
//该类模拟多线程Servlet情况
u[ I^*n3gpublic SmulateMultiThread implements Runnable{
0f*} sDX1W  public SmulateMultiThread {JAVA中文站社区门户5P6\if ^0x U
  }JAVA中文站社区门户3S0r8ArXJ'l
  public void (String args) {
k4kuL]"O2l*wp   //处理100个请求JAVA中文站社区门户/\)J\ ?.nQ6o K"x
    for( i=0;i<100;i)JAVA中文站社区门户5j%Sj6o t{5{*Vf
    {JAVA中文站社区门户2Q4a d9vK4^%f
       Thread( SmulateMultiThread).start;
&[3N SDZ^    }JAVA中文站社区门户M/RU,JHI'b T
  }JAVA中文站社区门户p+Dp }%i
  public void run  {
E/MGL0@s$F    HttpServletRequest request=null;
&TYv*[ yl:[    HttpServletResponse  response=null;
.X:O+e^m G6y}ha    try {JAVA中文站社区门户)I!Y9D;\2_ p_
      WebContainer.getServlet.doGet(request, response);
,m R0j^gq    }
7J8[ z8?B3D"v    catch (IOException ex) {
!pr*B&CP} u,i(o c:_    }
%P0z1j'ALq W    catch (ServletException ex) {JAVA中文站社区门户$e%oD/[ zc
    }JAVA中文站社区门户1Tc7X2G"S W
  }JAVA中文站社区门户)lg.TO SLx
}JAVA中文站社区门户"B3et~V4y;P%R*@o
//这是个Servlet类JAVA中文站社区门户Q:lC}#rlB
UnsafeServlet extends HttpServlet{
_'d o2yUh  private String unsafe;
q}w4vY)~1yeI3N  public void init throws ServletException {JAVA中文站社区门户vK$ix+{K6fq ]
  }
{Jw~{"d  //Process the HTTP Get request
m&Xy*pC DT  public void doGet(HttpServletRequest request, HttpServletResponse response)JAVA中文站社区门户B`7t_Z1~8~5S
throws ServletException, IOException {
w8Y1`h;r"nI]    unsafe=Thread.currentThread.getName;JAVA中文站社区门户/WBr0L0Y,sl5mJ/| e
    .out.prln(unsafe);JAVA中文站社区门户3| d0ak2P/K&u i
  }JAVA中文站社区门户,t$}*j9z h7DfN1j
}JAVA中文站社区门户)R ~9|;p-aR*Sf&p!G
//这个是容器类JAVA中文站社区门户\6mK$ft0zP8oH w
WebContainer{JAVA中文站社区门户 m@D bn:F{
  private UnsafeServlet us= UnsafeServlet;
K;v8E3f.b2@d9[f  public UnsafeServlet getServlet{JAVA中文站社区门户8W&hvcu,RB
    us;JAVA中文站社区门户$S+d4?5N(w.W^U t8J
  }
``+k ^SiS1K5N[}JAVA中文站社区门户#] DUu6L2r6g-{ ll;ja
JAVA中文站社区门户2MI7Xj_!iK
输出了100区别线程名称,如果有100个请求同时被这个Servlet处理话,那么unsafe就可能有100种去值,最后客户端将得到值.比如客户1请求线程名为thread-1,但是返回给他可能是thread-20.表现在现实中就是,我登陆用户名是user1,登陆后变成了user2. JAVA中文站社区门户` ?I9mAv{K
那么怎样才能是Servlet安全呢,凡是多个线程可以共享就不要使用(例子变量+类变量),就这么简单.也可以使用synchronized同步思路方法,但是这样效率不高,还可以使用单线程模型,这样话效率就更低了,100个请求同时来时候就要例子化100个例子.
oXY4wy8\思路方法中临时变量是不会影响线程安全,他们是在栈上分配空间,而且每个线程都有自己私有栈空间. JAVA中文站社区门户tcQcCe
3.JSP中线程安全 JAVA中文站社区门户#T%a;Rm8Z1F"i| e0\p
JSP本质是Servlet,所有只要明白了Servlet安全问题,JSP安全问题应该很容易理解.使用声明变量是Servlet例子变量,不是线程安全,其他都是线程安全.
]#B"s Q*FDq`2@JAVA中文站社区门户(xg8yJ$p
<%! String unsafeVar; %> //不是线程安全JAVA中文站社区门户/B;o R&qOcV
<% String safeVar; %>      // 线程安全
hwVX o3avR`
}u'\5n*^(F,j整理总结:线程安全问题主要是由例子变量造成,不管在Servlet还是JSP,或者在StrutsAction里面,不要使用例子变量,任何思路方法里面都不要出现例子变量,你就是线程安全

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: