java调用方法与内存分配关系

liujun3512159 2009-12-05 03:09:45
大家应该都比较熟悉servlet,每当服务器端启动的时候,会有一个servlet实例
我现在有几个问题,一直困扰着我,希望大家帮忙解答下
既然服务端就一个servlet实例,那么如果有多个人同时发出请求,就有并发问题,就会同时调用dopost()方法,我现在想问下,是不是每个人调用dopost()方法的时候,就会在服务器端重新开辟一个内存空间?
但是,我想,既然就一个servlet实例,我想,就应该只有一块固定的空间开辟给dopost()方法,如果这样,外面的n个客户同时发出请求的话,会不会出现内存空间互相覆盖的可能哦?

还有,java可以new 多个对象实例,按照我从书上的理解,不论new多少个对象实例,系统只会给每个方法分配一个对应的入口地址,请问是不是这样的?
如果是这样,我现在new 了10个对象实例,这10个对象同时调用同一个方法,是不是,会都从同一个内存入口地址出发,分别开辟10块空间进行运算哦?
...全文
377 19 打赏 收藏 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujun3512159 2009-12-09
  • 打赏
  • 举报
回复
谢谢了,这下明白了
dracularking 2009-12-09
  • 打赏
  • 举报
回复
Servlets应该可以在一个时间运行多个service方法
云上飞翔 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liujun3512159 的回复:]
希望大家继续发言
我知道一个类要实现多线程,那么就必须继承Thread或者实现Runnable。
大家都知道Servlet是多线程的。我查了一下sun的servlet的源代码,没有发现有继承Thread类和实现Runnable 接口,或者有什么内部继承或者实现了相应的类。我知道可能是Application Server里创建Servlet线程并对其进行管理。有谁对这方面有研究,请指教一下,多谢了!
[/Quote]

这说明楼主没有看懂我12楼的贴子

与Servlet是不是多线程是没有关系的

是服务器针对每一个客户机的请求,创建或从线程池中复用一个线程,该线程只是使用那个Servlet的实例(通常只有一个,并不是要求Servlet是多线程),该线程在自己的run()中调用那个Servlet的实例service(...)方法。
ly06310210507 2009-12-09
  • 打赏
  • 举报
回复
谢谢啦
liujun3512159 2009-12-09
  • 打赏
  • 举报
回复
希望大家继续发言
我知道一个类要实现多线程,那么就必须继承Thread或者实现Runnable。
大家都知道Servlet是多线程的。我查了一下sun的servlet的源代码,没有发现有继承Thread类和实现Runnable 接口,或者有什么内部继承或者实现了相应的类。我知道可能是Application Server里创建Servlet线程并对其进行管理。有谁对这方面有研究,请指教一下,多谢了!
liangpei2008 2009-12-09
  • 打赏
  • 举报
回复
楼主对多线程的概念好像不清楚啊
bayougeng 2009-12-09
  • 打赏
  • 举报
回复
创建线程与客户端请求进行对应,这个是web容器的事。
多线程也是有web容器来负责完成的。
zhangwenmin 2009-12-07
  • 打赏
  • 举报
回复
多线程,只不过你看不到
APOLLO_TS 2009-12-07
  • 打赏
  • 举报
回复
把方法指针先入栈,其次是参数从左到右,一次入栈。

最后返回就是那个return xxx,在内存区占用基本不到500ms,外加线程独立,栈区独立,没干扰。
liujun3512159 2009-12-07
  • 打赏
  • 举报
回复
呵呵,看样子,我还得找些资料研究下,有些地方还是不很明白
云上飞翔 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qingzhe2008 的回复:]
还不是很清楚,希望有人详解。。。
[/Quote]

其实内部过程是简单的:
1)服务端就一个servlet实例,通常服务器都是这样做的。
2)那么如果有多个人同时发出请求,就有并发问题,就会同时调用dopost()方法,我现在想问下,是不是每个人调用dopost()方法的时候,就会在服务器端重新开辟一个内存空间?
内部工作过程是这样的:当多个人同时发出请求时,每一个客户机方的请求,服务器就创建一个线程,用这个线程来执行Servlet中的service(...)方法,而该方法最终调用你的重写的doPost()方法。因此:这就是为什么要求程序员使用局部变量(即:doPost()方法内部的变量),因为:doPost()方法内部的变量是不存在并发问题的。而如果是使用Servlet类中的变量(类变量或实例变量,就有严重的并发问题,即:多个线程访问一个变量
qingzhe2008 2009-12-07
  • 打赏
  • 举报
回复
还不是很清楚,希望有人详解。。。
liujun3512159 2009-12-07
  • 打赏
  • 举报
回复
谢谢各位
liujun3512159 2009-12-06
  • 打赏
  • 举报
回复
顶一下哦,2楼给我的地址,我看了,有些难哦,谁能给我通俗易懂的解释下哦
song_da_gang 2009-12-06
  • 打赏
  • 举报
回复
第二个问题,你说的对,是“会都从同一个内存入口地址出发,分别开辟10块空间进行运算”,但可能你未必理解其工作方式,“分别开辟10块空间进行运算”是指分别分配十份的堆栈空间,且就像我上面回复的,栈空间的分配是互不干扰的。
song_da_gang 2009-12-06
  • 打赏
  • 举报
回复
呵呵,第一个问题,对于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()方法的栈空间的分配是互不干扰的。这样说不知你能不能明白。
liujun3512159 2009-12-06
  • 打赏
  • 举报
回复
看样子今天周末,没人回答了
yang677888 2009-12-05
  • 打赏
  • 举报
回复
内存分配,不懂,帮顶

关注,学习
frank3G 2009-12-05
  • 打赏
  • 举报
回复
http://blog.csdn.net/frank3G/archive/2009/12/02/4923218.aspx

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧