| 发表于:2007-10-25 19:23:35 楼主 |
上次面试时,问了个如果多用户并发访问servlet时,该如何解决.当时想的是好像是由web容器解决的吧. 后来他再问句如果多个用户访问servlet,容器中会有几个实例,这个就一点也清楚了,随便猜了说1个(有点主观) 后来到网上查了下,结果如下: ------------------------- 一般来说servlet是线程安全的,所以每个用户每一次的调用都是独立的 当一个servlet被创建并且被装载到内存,它在内存中仅有一个实例,采用多线程去访问这个servlet实例 ---------------------------- 再后来自己做了个实验, http://laorer.javaeye.com/admin/show/132771 实验的思路如下: --- 在servlet中定义了一个整型的类变量(没有进行同步操作,可以粗略的存储被请求的次数)还有整型的实例变量(也没有进行同步操作,用这个来判定是否与类变量相等,相等则只有一个实例,不等应该有多个实例) ----- 实验结果证明上面那个说法的正确性,本来也就没事了,但今天无意看到一个servlet2.3规范,便看了下, 说法是这样的. ------------ for a servlet not hosted in a distributed environment (the default), the servlet container must use only one instance per servlet declaration. however, for a servlet implementing the singlethreadmodel interface, the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instance. in the case where a servlet was deployed as part of an application marked in the deployment descriptor as distributable, a container may have only one instance per servlet declaration per virtual machine (vm). however, if the servlet in a dis- tributable application implements the singlethreadmodel interface, the container may instantiate multiple instances of that servlet in each vm of the container. ------------------- 也找了一份中文规范,不过感觉翻得不太好就不帖出来了 说是如果实现了singlethreadmodel 接口,则可能会有多个实例.便实验了一下,出现的结果不知道怎么解释,实验的方法和前面一样,不过servlet实现了singlethreadmodel 接口. 结果是每刷一次 类变量增加一次,这个没问题,但是每刷五次,实例变量才增加一次,而且多个浏览器访问的时候,当一个实例变量增加了,其他浏览器的实例变量也增加, 这点就不清楚为什么了,开始以为是容器中有五个实例,但后来想想不对,每个浏览器的实例应该不一样的,所以为什么一个浏览器请求的值变化了,其他浏览器请求的值也会变了呢 实验环境是 eclipse3.2(估计和这没关系) + weblogic 8.1 + jdk 1.4 |
|
|
|
|