上次面试时,问到了当服务器启动之后,多个用户访问servlet时,如何解决并发问题,当时感觉并发问题好像是由web容器解决的吧,后来问到那会有多少个实例呢?这个没有印象,就说好像是一个吧,他又追问,多个用户请求servlet,容器中只有一个servlet实例吗?又改口了,多个.
后来查了下资料,说法如下
===========================
一般来说servlet是线程安全的,所以每个用户每一次的调用都是独立的
一般由容器解决,但对于类变量,则需要自己控制,数据库访问,就有同步控制
当一个SERVLET被创建并且被装载到内存,它在内存中仅有一个实例,采用多线程去访问这个SERVLET实例
=====================================
还是不是很肯定,所以写了个例子验证了一下,确实只有一个实例,思想是在这个servlet中加一个int 型成员变量,第次访问,成员变量加1,多次访问,如果每次访问的成员变量都是加一的,则说明容器中只有一个servlet实例,反之则有多个实例.代码如下,
- private int i=0 ;
- private int k ;
- private static int j=0;
- ublic void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out
- .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
- out.println("<HTML>");
- out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
- out.println(" <BODY>");
- out.print(" This is ");
- out.print(this.getClass());
- out.println(", using the GET method");
- out.println("------------------");
- out.println(" private i= " + i++);
- out.println(" private k= " + k++);
- out.println(" static j= " + j++);
- out.println("------------------");
- out.println(" </BODY>");
- out.println("</HTML>");
- out.flush();
- out.close();
- }
其余代码都是自动生成的.结果是每次访问,成员变量都加一 .
下面面试时好像都会问到,只初始化一次,记住,
sevlet 生命周期
(1)加载和实例化
(2)初始化(容器调用Servlet的init()方法初始化这个对象init()只能用一次)
(3)请求处理(容器调用Servlet的service()方法对请求进行处理)
(4)服务终止(容器调用Servlet的destroy()方法将servlet实例从容器中移除,释放所有资源)
感觉好多问题都是相关的,但平时没有仔细想想,面试时,又不会有太多的思考机会,哎,愿大家有所收获吧.