读书人

HttpServlet单范例多线程的探讨

发布时间: 2012-06-27 14:20:09 作者: rapoo

HttpServlet单实例多线程的探讨

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个不同的实例)

读书人网 >软件架构设计

热点推荐