大家应该都比较熟悉servlet,每当服务器端启动的时候,会有一个servlet实例
我现在有几个问题,一直困扰着我,希望大家帮忙解答下
既然服务端就一个servlet实例,那么如果有多个人同时发出请求,就有并发问题,就会同时调用dopost()方法,我现在想问下,是不是每个人调用dopost()方法的时候,就会在服务器端重新开辟一个内存空间?
但是,我想,既然就一个servlet实例,我想,就应该只有一块固定的空间开辟给dopost()方法,如果这样,外面的n个客户同时发出请求的话,会不会出现内存空间互相覆盖的可能哦?还有,java可以new 多个对象实例,按照我从书上的理解,不论new多少个对象实例,系统只会给每个方法分配一个对应的入口地址,请问是不是这样的?
如果是这样,我现在new 了10个对象实例,这10个对象同时调用同一个方法,是不是,会都从同一个内存入口地址出发,分别开辟10块空间进行运算哦?

解决方案 »

  1.   

    http://blog.csdn.net/frank3G/archive/2009/12/02/4923218.aspx
      

  2.   

    呵呵,第一个问题,对于Web服务器端来说,一般来说Servlet都是单例的。然而,Servlet的单例不由你的class来决定,而是由您在web.xml里配置的servlet-name来决定。也就是说每一个servlet-name只有1个单例。当你有3个不同的serlvet-name指定了相同的1个servlet-class时,容器会产生3个不同的servlet object。只有3个。
    对于你说的dopost()方法,调用方法是不会分配堆空间的,而只会消耗栈空间,你的这种情况就是多个用户都调用一个Servlet实例的dopost()方法,那么,每个用户的dopost()方法的栈空间的分配是互不干扰的。这样说不知你能不能明白。
      

  3.   

    把方法指针先入栈,其次是参数从左到右,一次入栈。最后返回就是那个return xxx,在内存区占用基本不到500ms,外加线程独立,栈区独立,没干扰。
      

  4.   


    其实内部过程是简单的:
    1)服务端就一个servlet实例,通常服务器都是这样做的。
    2)那么如果有多个人同时发出请求,就有并发问题,就会同时调用dopost()方法,我现在想问下,是不是每个人调用dopost()方法的时候,就会在服务器端重新开辟一个内存空间? 
    内部工作过程是这样的:当多个人同时发出请求时,每一个客户机方的请求,服务器就创建一个线程,用这个线程来执行Servlet中的service(...)方法,而该方法最终调用你的重写的doPost()方法。因此:这就是为什么要求程序员使用局部变量(即:doPost()方法内部的变量),因为:doPost()方法内部的变量是不存在并发问题的。而如果是使用Servlet类中的变量(类变量或实例变量,就有严重的并发问题,即:多个线程访问一个变量
      

  5.   

    希望大家继续发言
    我知道一个类要实现多线程,那么就必须继承Thread或者实现Runnable。 
    大家都知道Servlet是多线程的。我查了一下sun的servlet的源代码,没有发现有继承Thread类和实现Runnable 接口,或者有什么内部继承或者实现了相应的类。我知道可能是Application Server里创建Servlet线程并对其进行管理。有谁对这方面有研究,请指教一下,多谢了! 
      

  6.   


    这说明楼主没有看懂我12楼的贴子。这与Servlet是不是多线程是没有关系的。是服务器针对每一个客户机的请求,创建或从线程池中复用一个线程,该线程只是使用那个Servlet的实例(通常只有一个,并不是要求Servlet是多线程),该线程在自己的run()中调用那个Servlet的实例service(...)方法。
      

  7.   

    Servlets应该可以在一个时间运行多个service方法
      

  8.   

    创建线程与客户端请求进行对应,这个是web容器的事。
    多线程也是有web容器来负责完成的。