background image

Java 程序员需注意的 Servlet 和 JSP 的线程安全问题

线程是被个别创建的,但可以将它们归类到线程组中,以便于调试和监视。只能在创建线
程的同时将它与一个线程组相关联。在使用大量线程的程序中,使用线程组组织线程可能
很有帮助。可以将它们看作是计算机上的目录和文件结构。

    

线程间发信
 编写 Servlet 和 JSP 的时候,线程安全问题很容易被忽略,如果忽视了这个问题,你的

程序就存在潜在的隐患。
  1.Servlet 的生命周期
  Servlet 的生命周期是由 Web 容器负责的,当客户端第一次请求 Servlet 时,容器负
责初始化 Servlet,也就是实例化这个 Servlet 类。以后这个实例就负责客户端的请求,一般
不会再实例化其他 Servlet 类,也就是有多个线程在使用这个实例。Servlet 之所以比 CGI
效率高就是因为 Servlet 是多线程的。如果该 Servlet 被声明为单线程模型的话,容器就会
维护一个实例池,那么将存在多个实例。
  2.Servlet 的线程安全
  Servlet 规范已经声明 Servlet 不是线程安全的,所以在开发 Servlet 的时候要注要
这个问题。这里以一个现实的模型来说明问题 ,先定义一个 Servlet 类,再定义一个
SmulateMultiThread 类和 WebContainer 类。
1 import javax.servlet.http.HttpServlet; 
2 import javax.servlet.ServletException; 
3 import javax.servlet.http.HttpServletRequest; 
4 import javax.servlet.http.HttpServletResponse; 
5 import java.io.IOException; 
6 //该类模拟多线程 Servlet

 

的情况

7 public class SmulateMultiThread implements Runnable{ 
8 public SmulateMultiThread() { 
9 } 
10 public static void main(String[] args) { 
11 //处理 100

 

个请求

12 for(int i=0;i<100;i++) 
13 { 
14 new Thread(new SmulateMultiThread()).start(); 
15 } 
16 } 
17 public void run() { 
18 HttpServletRequest request=null; 
19 HttpServletResponse response=null; 
20 try { 
21 WebContainer.getServlet().doGet(request, response);