1、HttpServlet默认是
单实例多线程的
2、网上一直有人说实现SingleThreadModel接口就能实现单线程,由它的名字来看,确实很像,但却不是
3、实现 SingleThreadModel接口只能实现 多实例,servlet是 无法实现单线程的(暂时没发现有什么办法实现,如有错误,欢迎交流指正)
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";
}
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
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
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个不同的实例)