并发访问问题,在项目程序(b/s)代码中的方法(多人调用)是什么样的情况。 从静态和实列方法谈谈???

如:publicstringtest(Stringstr){//第一个人test(“123”)//第二人test(“456”)strings=str;//第二人运行到这s... 如:
public string test(String str){//第一个人test(“123”)//第二人test(“456”)
string s=str;//第二人运行到这s=“456”;执行完后第一人s=“456”
。。。。。。//第一人运行到这s=“123”;
return s;
}
我知道我说的这个例子一定是错的,但是我不知道如何理解多人调用项目中的同一方法时是什么样的,感谢高手帮忙。学java、c#和delphi等语言(做过b/s)编程的我想应该都应该理解这个,我刚入软件这个行业,大家帮帮忙啊!!!!!!!
展开
 我来答
qiji212
2012-12-13 · TA获得超过109个赞
知道小有建树答主
回答量:222
采纳率:0%
帮助的人:181万
展开全部
多人做同一个项目的时候,是要用软件同步的。

看你的说法,应该是多人做同一个项目模块。
调试的时候,是在服务器下载到本地进行的调试,一般上传的话都会先同步下载以后再上传,同时也会互相通知。
目的就是怕你上传的时候,把服务器版本覆盖了,不过现在都是智能备份的。

我晕了,才看明白你的问题,不是开发上的,而是运行的时候的。

对,就像你说的,当一个包放置在服务器上以后,会单独开一个线程运行每一条请求,除非你的代码写了,不允许并行执行,否则每个代码的生存期内都是再并行的执行。
swordlance
2012-12-13 · TA获得超过1008个赞
知道小有建树答主
回答量:535
采纳率:75%
帮助的人:448万
展开全部
首先你这个例子,里面的s和str都是局部变量,是线程安全的(因为一个人调用就有一个副本),所以不用考虑多线程。
调用过程可能是这样的。
第二个人调用test();当前指令IP2压栈。
形参存入strP2,压栈。
局部变量sP2,压栈。
此时第一人调用test();当前线程内存页P2保存,切换到第一人所在线程的内存页P1。
当前指令IP1压栈。
形参出入strP1,压栈;
局部变量sP1,压栈;
执行test的指令
到达return语句,sP1出栈,当前栈顶strP1。
strP1出栈,当前栈顶IP1
IP1出栈,线程继续执行IP1位置的指令
此时第二人的线程进入,再切换到P2
执行test的指令
到达return语句,sP2出栈,当前栈顶strP2。
strP2出栈,当前栈顶IP2
IP2出栈,线程继续执行IP2位置的指令.

另外并发调用方法是不分多线程还是单线程,关键在于你的变量,对象是否是线程安全的。如果多线程程序要排他的使用非线程安全的对象,就需要线程同步了,一般是用锁来实现。比如你的test()方法如果需要排他的访问一个全局的静态string的话,就要在先检查这个string是否被其它线程占用,如果被占用就等待或放弃,如果没有就占用,使用,解除占用。不同语言有不同的同步方法,比如.NET有lock,Monitor,ReaderWriterLock等,Java有synchronized,lock等。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
504229406
2012-12-12 · 超过15用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:36.8万
展开全部
要不要注意并发主要看方法执行有没有共享“资源”。像你举得例子,是非类方法,不同的人调用的话需要new新类,然后执行方法,new出来的实例在不同的内存中,是没有共享任何东西的。
String s;

public string test(String str){//第一个人test(“123”)//第二人test(“456”)
s=str;//第二人运行到这s=“456”;执行完后第一人s=“456”
。。。。。。//第一人运行到这s=“123”;
return s;
}
上面的情况也不需要注意并发。
static String s;
public string test(String str){//第一个人test(“123”)//第二人test(“456”)
s=str;//第二人运行到这s=“456”;执行完后第一人s=“456”
。。。。。。//第一人运行到这s=“123”;
return s;
}
s是静态变量,不同实例的方法共享一个s就要注意并发了,可以用Volatile去修饰如volatile static string s。多看看,我相信你真正的话心思去学,一定会明白的。
更多追问追答
追问
帮忙讲解一下,访问时的流程。
如一人响应一个请求,到服务器是什么情况。
我想是不是:一个(两个)请求进入服务器,服务器单独开出一个(两个)线程,处理该请求的所有操作。在请求中生成的对象和变量都放在该请求的线程堆栈中啊。
能给我讲一下问题补充中的例子,例子的方法是静态方法
public static string test(String str){//第一个人test(“123”)//第二人test(“456”)
。。。
}
追答
我用servlet做例子吧,servlet的生命周期有session和全局两种,生命周期为session的servlet就像你说的每一个请求都由不同的用户自己的线程求new然后使用方法,如果不new就会报指针为空的异常,生命周期为全局的servlet只要初始化一次就可以反复的使用这个实例。不管是session还是全局是否要注意并发就看当前状况是否满足并发发生的条件:共享资源。上面的例子不管是静态方法还是非静态方法只要有共享资源就要注意,否则不需要注意并发。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
syht2000
高粉答主

2012-12-12 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部
b/s是是无状态的,各个浏览者之间也是独立的,无论你访问多少次这个方法都会被视作第一次访问,所以不存在并发的问题。
追问
帮忙讲解一下,访问时的流程。
如一人响应一个请求,到服务器是什么情况。
我想是不是:一个(两个)请求进入服务器,服务器单独开出一个(两个)线程,处理该请求的所有操作。在请求中生成的对象和变量都放在该请求的线程堆栈中啊。

能给我讲一下问题补充中的例子吗。(如例子的方法是静态方法)
追答
百度一下 HTTP请求流程,第一个就是
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
pandaloveme058
2012-12-12 · TA获得超过119个赞
知道小有建树答主
回答量:227
采纳率:100%
帮助的人:113万
展开全部
你可以考虑一下网上订票系统 12306
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式