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

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

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

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

来源: 发布时间:星期四, 2008年12月18日 浏览:2次 评论:0
1.Servlet生命周期 Servlet生命周期是由Web容器负责,当客户端第次请求Servlet时,容器负责化Servlet,也就是例子化这个Servlet类.以后这个例子就负责客户端请求,般不会再例子化其他Servlet类,也就是有多个线程在使用这个例子.Servlet的所以比CGI效率高就是Servlet是多线程.如果该Servlet被声明为单线程模型话,容器就会维护个例子池,那么将存在多个例子. 2.Servlet线程安全 Servlet规范标准已经声明Servlet不是线程安全,所以在开发Servlet时候要注要这个问题.这里以个现实模型来介绍说明问题,先定义个Servlet类,再定义个SmulateMultiThread类和WebContainer类. import javax.servlet.http.HttpServlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; //该类模拟多线程Servlet情况 public SmulateMultiThread implements Runnable{ public SmulateMultiThread { } public void (String args) { //处理100个请求 for( i=0;i<100;i) { Thread( SmulateMultiThread).start; } } public void run { HttpServletRequest request=null; HttpServletResponse response=null; try { WebContainer.getServlet.doGet(request, response); } catch (IOException ex) { } catch (ServletException ex) { } } } //这是个Servlet类 UnsafeServlet extends HttpServlet{ private String unsafe; public void init throws ServletException { } //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { unsafe=Thread.currentThread.getName; .out.prln(unsafe); } } //这个是容器类 WebContainer{ private UnsafeServlet us= UnsafeServlet; public UnsafeServlet getServlet{ us; } } 输出了100区别线程名称,如果有100个请求同时被这个Servlet处理话,那么unsafe就可能有100种去值,最后客户端将得到值.比如客户1请求线程名为thread-1,但是返回给他可能是thread-20.表现在现实中就是,我登陆用户名是user1,登陆后变成了user2. 那么怎样才能是Servlet安全呢,凡是多个线程可以共享就不要使用(例子变量+类变量),就这么简单.也可以使用synchronized同步思路方法,但是这样效率不高,还可以使用单线程模型,这样话效率就更低了,100个请求同时来时候就要例子化100个例子. 思路方法中临时变量是不会影响线程安全,他们是在栈上分配空间,而且每个线程都有自己私有栈空间. 3.JSP中线程安全 JSP本质是Servlet,所有只要明白了Servlet安全问题,JSP安全问题应该很容易理解.使用声明变量是Servlet例子变量,不是线程安全,其他都是线程安全. <%! String unsafeVar; %> //不是线程安全 <% String safeVar; %> // 线程安全 整理总结:线程安全问题主要是由例子变量造成,不管在Servlet还是JSP,或者在StrutsAction里面,不要使用例子变量,任何思路方法里面都不要出现例子变量,你就是线程安全

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: