大家应该都比较熟悉servlet,每当服务器端启动的时候,会有一个servlet实例
我现在有几个问题,一直困扰着我,希望大家帮忙解答下
既然服务端就一个servlet实例,那么如果有多个人同时发出请求,就有并发问题,就会同时调用dopost()方法,我现在想问下,是不是每个人调用dopost()方法的时候,就会在服务器端重新开辟一个内存空间?
但是,我想,既然就一个servlet实例,我想,就应该只有一块固定的空间开辟给dopost()方法,如果这样,外面的n个客户同时发出请求的话,会不会出现内存空间互相覆盖的可能哦?还有,java可以new 多个对象实例,按照我从书上的理解,不论new多少个对象实例,系统只会给每个方法分配一个对应的入口地址,请问是不是这样的?
如果是这样,我现在new 了10个对象实例,这10个对象同时调用同一个方法,是不是,会都从同一个内存入口地址出发,分别开辟10块空间进行运算哦?
我现在有几个问题,一直困扰着我,希望大家帮忙解答下
既然服务端就一个servlet实例,那么如果有多个人同时发出请求,就有并发问题,就会同时调用dopost()方法,我现在想问下,是不是每个人调用dopost()方法的时候,就会在服务器端重新开辟一个内存空间?
但是,我想,既然就一个servlet实例,我想,就应该只有一块固定的空间开辟给dopost()方法,如果这样,外面的n个客户同时发出请求的话,会不会出现内存空间互相覆盖的可能哦?还有,java可以new 多个对象实例,按照我从书上的理解,不论new多少个对象实例,系统只会给每个方法分配一个对应的入口地址,请问是不是这样的?
如果是这样,我现在new 了10个对象实例,这10个对象同时调用同一个方法,是不是,会都从同一个内存入口地址出发,分别开辟10块空间进行运算哦?
对于你说的dopost()方法,调用方法是不会分配堆空间的,而只会消耗栈空间,你的这种情况就是多个用户都调用一个Servlet实例的dopost()方法,那么,每个用户的dopost()方法的栈空间的分配是互不干扰的。这样说不知你能不能明白。
其实内部过程是简单的:
1)服务端就一个servlet实例,通常服务器都是这样做的。
2)那么如果有多个人同时发出请求,就有并发问题,就会同时调用dopost()方法,我现在想问下,是不是每个人调用dopost()方法的时候,就会在服务器端重新开辟一个内存空间?
内部工作过程是这样的:当多个人同时发出请求时,每一个客户机方的请求,服务器就创建一个线程,用这个线程来执行Servlet中的service(...)方法,而该方法最终调用你的重写的doPost()方法。因此:这就是为什么要求程序员使用局部变量(即:doPost()方法内部的变量),因为:doPost()方法内部的变量是不存在并发问题的。而如果是使用Servlet类中的变量(类变量或实例变量,就有严重的并发问题,即:多个线程访问一个变量)
我知道一个类要实现多线程,那么就必须继承Thread或者实现Runnable。
大家都知道Servlet是多线程的。我查了一下sun的servlet的源代码,没有发现有继承Thread类和实现Runnable 接口,或者有什么内部继承或者实现了相应的类。我知道可能是Application Server里创建Servlet线程并对其进行管理。有谁对这方面有研究,请指教一下,多谢了!
这说明楼主没有看懂我12楼的贴子。这与Servlet是不是多线程是没有关系的。是服务器针对每一个客户机的请求,创建或从线程池中复用一个线程,该线程只是使用那个Servlet的实例(通常只有一个,并不是要求Servlet是多线程),该线程在自己的run()中调用那个Servlet的实例service(...)方法。
多线程也是有web容器来负责完成的。