总是说servlet是多线程的,谁能具体解释一下,是只有一个实例,但被多个线程使用,每个线程对应一个客户请求吗,那么这些servlet的方法不是同步的了,所以效率才高,而且线程不安全,这样理解对吗。

解决方案 »

  1.   

    但是这样如何保证线程安全?第一个用户的request.getParameter("userName")会被第二个线程读到吗
      

  2.   

    当然不会了。
    Servlet是个程序,一个Java程序,被Tomcat调用了,随Web服务一直运行着。
    其中,Servlet的service()方法,是能被Tomcat反复调用的。
    每调用一次,就是创建了一个线程,并把封装好的 request 对象和 response对象 传递给service方法。其中,request 和 response 是Tomcat接收到的客户端的请求,再封装而成的对象。按你上面所说的,每个 request 对象是不同的(虽然都是HttpRequest类),所获取的 Parameter肯定也不同了,不能被第二个进程读到。当它调用 servlet 自身的方法,把它放到 ServletContext中,或者是HttpSession中,就能被其它的线程读到了。
      

  3.   

    说的简单点:sevlet是多线程的,有影响的地方就是不要使用属性.servlet中的doGet\doPost这些方法没有线程安全的问题,在方法中的变量不会被其它线程影响,但是servlet中的属性就可能被多个线程修改.比如
    public class A extends HttpServlet{
        private String s=null;//属性
        ..doGet(request,response){
            String ss="SSS";
            //改变属性值
             s=...
            
        }
    }
    这个例子,如果有两个线程同时访问这个servlet,在doGet()方法中第一个线程改变了s(属性)的值,第二个线程就可能错误的读取了第一个线程改变的s值,但是不管如何,局部变量ss是不会受影响的.所以在servlet考虑线程安全,不要用属性,就用局部变量好了