`
wsqwsq000
  • 浏览: 675511 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HttpServlet单实例多线程的探讨

    博客分类:
  • j2ee
 
阅读更多

1、HttpServlet默认是单实例多线程
2、网上一直有人说实现SingleThreadModel接口就能实现单线程,由它的名字来看,确实很像,但却不是
3、实现SingleThreadModel接口只能实现多实例,servlet是无法实现单线程的(暂时没发现有什么办法实现,如有错误,欢迎交流指正)
为了验证上述的内容,我们来做个测试,代码如下:
 
public class DemoServlet extends HttpServlet implements SingleThreadModel{
       private static final long serialVersionUID = 1L;
       private String time = "first";//验证单实例
 
       protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  
           //验证多线程
           System.out.println("start--" + Thread.currentThread().getId() + ": " + new Date().getTime());
           try {
               Thread.sleep(20000); // 为了突出并发问题,在这设置一个延时
               System.out.println("  end--" + Thread.currentThread().getId() + ": " + new Date().getTime());
           } catch (InterruptedException e) {
           }
           System.out.println(" time--" + Thread.currentThread().getId() + ": " + time);
           time = "second";
      }
}
 
输出结果:
start--36: 1290678352796
start--35: 1290678354078
 end--36: 1290678372796
time--36: first
 end--35: 1290678374078
 time--35: first
 
现在我们不实现接口SingleThreadModel,输出结果:
start--36: 1290678542750
start--35: 1290678543890
 end--36: 1290678562750
time--36: first
 end--35: 1290678563890
time--35: second
 
注意:只有在刚启动服务初始化时,结果才会如上;否则由于同初始化是同一个实例,所以2个time会显示second
从上面的结果不难看出:
1、不管实不实现接口SingleThreadModel,servlet都是多线程的
A、B 2个线程,线程ID永远不一样;B的开始时间不会在A的结束时间之后。
2、不实现接口SingleThreadModel,servlet是单实例的(B的time的结果因为A执行后变为second)
实现接口SingleThreadModel,servlet是多实例的(A、B的time都是first,证明A、B是2个不同的实例)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics