Java 多线程问题

2015-04-28 00:02:10 +08:00
 HelloWorld11

各位,晚上好!最近在学 Java Servlet,遇到一个问题,请大家帮忙看看:

我们都知道,一般情况下,Servlet是单实例 多线程的。

假设现在有一个实例,A、B两个用户同时用到了这个实例,假设A、B同时访问 service()方法。那么应该是有2个线程。 我的问题是,因为 service()方法的入口(跟C++函数的入口应该一样吧)只有一个,A、B同时(就是同时,不是同时段哈~)调用service()方法的话,不会冲突吗?

对了,现在服务器都是多核,支持多线程的,A、B两个线程恰好同时刻运行应该是可以的吧。 现在不管有没有什么共享变量,线程安全的问题。 我就是想知道,2个线程同时访问一个方法,会发生什么???或者,在JVM的调度中,是不是根本不会让这两个线程同时运行,即使服务器支持多线程。

请大家帮忙,让小白理解哈~~~

4012 次点击
所在节点    Java
30 条回复
flaty
2015-04-28 10:21:21 +08:00
@HelloWorld11
是,,如cpu的缓存,寄存器,,其实是会拷贝那里再操作的.,所以井水不犯河水了.
HarryZD
2015-04-28 10:21:25 +08:00
机器如果多核,可以运行多线程,每个线程都有自己的方法栈,如果不涉及成员变量的话,方法栈互不干扰
shuiniushushu
2015-04-28 10:35:18 +08:00
方法不怕同时调用,只要你的方法里面没有公共变量
HelloWorld11
2015-04-28 10:35:48 +08:00
@楼上所有人~ 多谢大家的帮忙哈~~谢谢~
ryd994
2015-04-29 02:26:38 +08:00
@khan 有关系
很多嵌入式C编译器默认是不可重入的,而GNU C库也在很长一段时间里默认不可重入。
是在大家内存多得用不完,栈空间用不完之后才默认可重入的
khan
2015-04-30 10:23:32 +08:00
@ryd994 函数是否可重入取决于编码习惯吧. 例如你在函数中使用了全局变量 会导致并发执行的情况下全局变量的读写不可预估. 这种状况就不可重入.
反之如果函数中没有互相干扰的访问资源, 则可重入.

你说的观点我有很多地方不清楚. 还请详细说明, 大家一起讨论讨论
khan
2015-04-30 10:28:08 +08:00
@ryd994 你说的情况即使存在, 我认为也不是编译器的原因, 关键因素应该在于 libc 的实现. 所以现在 ISO 组织制定标准时, 都会指明某些函数必须实现可重入 (IEEE Std 1003.1 )
ryd994
2015-04-30 14:14:01 +08:00
@khan 嵌入式编译器比如sdcc,因资源有限,会默认静态分配所有变量,类似static(但未明确声明static的可能被overlay,即不保证数据保留)
要可重入,实现的时候就要在栈上分配变量,而不是在编译的时候指定内存地址,这就是区别。
对嵌入式系统来说,受限于指令集,栈空间通常不足,所以不得已为之
正常PC平台的编译器没有这个问题,上述只是特例
hellomsg
2015-05-12 09:54:52 +08:00
@comicfans44 请问container的源码在哪里能找到,是tomcat、resin他们实现的吗?
comicfans44
2015-05-12 11:03:25 +08:00
@hellomsg tomcat是实现之一,jetty也是实现之一。两个都是开源的,源码可以直接拿来参考(resin没用过不知道)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/186844

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX