servlet是如何实现单实例多线程的? 是由web容器建立的线程还是servlet自己建立的.很混,求高人指点.

[复制链接]
查看11 | 回复1 | 2011-3-27 11:48:40 | 显示全部楼层 |阅读模式
回复

使用道具 举报

千问 | 2011-3-27 11:48:40 | 显示全部楼层
<pre id=\"best-answer-content\" class=\"reply-text mb10\">WEB容器标记一下 再回来

synchronized (a){你的这个a是不是在servlet开始定义的一个INTEGER成员变量吧?

你这个刷新两页面过程如下:假设a=0,当你刷新第一个时,产生线程1,此线程一直执行到synchronized (a){a;c=a;这个地方,然后线程1休息4秒,此时类成员变量a=1,方法变量c=a=1,而在4秒中未休息完时,你刷新第2个页面,又启动另一个线程2,此线程一直执行到synchronized 前面停止,一直等待上线程1弃锁,线程1在4秒后休息完毕,弃锁,然后线程2得到锁:线程2开始执行a;c=a,然后也休息4秒,此时:SERVLET单实例的a值为a=2,方法变量c=a=2;于此同时线程1继续往下执行B=A=2,所以最终结果第一个界面c为1,而第二个页面c=2
我说的可能不太清楚,你只要记住:多线程共享的变量是类成员变量a,线程之间争夺的锁也是对象的锁,而不是一个代码块,你这个例子里面 b、c是方法里面的局部变量,线程之间是安全的,故你只要追踪a的值得变化规律就行。
高深点可以研究一下他们说的工作存储块和资源内存块,貌似不是叫这个名字,忘光啦哈哈。保护明白在HI我吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行