上次面试时,问到了当服务器启动之后,多个用户访问servlet时,如何解决并发问题,当时感觉并发问题好像是由web容器解决的吧,后来问到那会有多少个实例呢?这个没有印象,就说好像是一个吧,他又追问,多个用户请求servlet,容器中只有一个servlet实例吗?又改口了,多个.
后来查了下资料,说法如下
===========================
一般来说servlet是线程安全的,所以每个用户每一次的调用都是独立的
一般由容器解决,但对于类变量,则需要自己控制,数据库访问,就有同步控制
当一个SERVLET被创建并且被装载到内存,它在内存中仅有一个实例,采用多线程去访问这个SERVLET实例
=====================================
还是不是很肯定,所以写了个例子验证了一下,确实只有一个实例,思想是在这个servlet中加一个int 型成员变量,第次访问,成员变量加1,多次访问,如果每次访问的成员变量都是加一的,则说明容器中只有一个servlet实例,反之则有多个实例.代码如下,
java 代码
- 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实例从容器中移除,释放所有资源)
感觉好多问题都是相关的,但平时没有仔细想想,面试时,又不会有太多的思考机会,哎,愿大家有所收获吧.
分享到:
相关推荐
在这个例子中,我们在`init()`方法中创建了一个`ScheduledExecutorService`实例,并设置了一个定时任务,它将在服务器启动后每小时执行一次。在`destroy()`方法中,我们关闭了`executor`以释放资源。 总结,通过在`...
总之,"一个支持servlet的web服务器.rar"这个压缩包可能包含了一个可运行的Servlet服务器实例或者一个与Servlet相关的项目。如果你打算学习或使用Servlet,你需要了解Servlet的基本概念、生命周期、API以及如何在...
当服务器启动或第一次接收到对Servlet的请求时,Servlet被加载并初始化。然后,每次有新的请求到来,Servlet都会调用`service()`方法来处理。当服务器关闭或不再需要Servlet时,会执行销毁方法。 2. **Servlet配置*...
在服务器启动时或首次接收到请求时,Servlet会被加载和初始化。然后,每当有请求到达,Servlet会处理该请求并返回响应。最后,当服务器关闭或者Servlet不再需要时,Servlet会被销毁。 2. **Servlet配置**:在`web....
JavaEE Servlet实例是一个...通过深入研究这个Servlet实例,开发者不仅可以掌握Servlet的基本用法,还能了解到如何在实际项目中组织和管理代码。同时,这也是进一步学习JavaEE框架如Spring MVC、Struts或JSF的基础。
4. 销毁:当Servlet不再需要时,Tomcat会调用`destroy()`方法释放资源,然后销毁Servlet实例。 在描述中提到的“博文链接:https://hbiao68.iteye.com/blog/1570415”可能提供了一个具体的示例或问题解决方案,但...
Servlet生命周期包括加载、初始化、服务、销毁四个阶段,它们在服务器启动、首次请求或配置改变时触发。Servlet通过`service()`方法接收客户端请求,然后根据请求类型调用`doGet()`或`doPost()`等方法进行处理。此外...
当服务器启动或第一次接收到对Servlet的请求时,Servlet容器(如Tomcat)会加载并初始化Servlet。初始化过程通常涉及配置信息的读取,如在web.xml中定义的初始化参数。Servlet在服务完成后,如果服务器关闭或手动...
当服务器启动或者用户首次发起对Servlet的请求时,如果服务器中还没有Servlet的实例,容器(例如Tomcat)会根据`web.xml`配置文件或Java注解找到对应的Servlet类,并加载这个类。加载后,服务器将创建Servlet的一个...
当Web应用启动时,Servlet容器会根据web.xml配置或者基于注解的配置创建Servlet实例。对于高并发场景,为了提高性能和资源利用率,Servlet容器通常会采用线程池来处理请求,而不是为每个请求创建一个新的Servlet实例...
1. **服务器启动与配置**:源码可能包含一个主类,负责启动服务器,并配置监听端口、根目录等设置。这通常涉及到Java的ServerSocket或Socket编程。 2. **HTTP协议解析**:服务器需要解析接收到的HTTP请求,包括请求...
- **加载与实例化**:当服务器启动或首次接收到对Servlet的请求时,会加载Servlet类并创建其单个实例。 - **初始化**:创建实例后,调用`init()`方法进行初始化。在这里,可以设置Servlet的初始配置。 - **服务**...
通过这个简单的Servlet实例,你已经掌握了创建和运行Servlet的基础知识。随着进一步的学习,你可以利用Servlet处理更复杂的任务,如会话管理、文件上传、数据库操作等。继续深入研究Servlet API和其他相关技术,如...
当服务器启动或第一次接收到对Servlet的请求时,Servlet容器会加载并实例化Servlet。接着,调用`init()`方法进行初始化,通常在这里设置配置参数。在处理客户端请求时,服务器会调用`service()`方法。最后,当服务器...
当服务器启动或第一次接收到对Servlet的请求时,Servlet会被加载和初始化。初始化通常在`init()`方法中完成,这里可以进行配置文件读取、数据库连接等初始化操作。然后,每当有请求到达,`service()`方法会被调用,...
1. **加载与实例化**:当服务器启动或第一次接收到对Servlet的请求时,会加载Servlet类并创建其单个实例。 2. **初始化**:创建实例后,服务器调用`init()`方法进行初始化,通常用于配置Servlet。 3. **服务**:每当...
服务器启动后,创建一个ServerSocket监听指定端口,等待客户端的连接。当接收到请求时,通过Socket读取请求数据,解析出HTTP报文的各个部分,如方法(GET、POST等)、URL、状态码、头部信息和可能的请求体。 ...
当服务器启动或第一次接收到对Servlet的请求时,会加载Servlet类并创建其实例。这是通过Servlet容器(如Tomcat)来完成的,容器使用Java的`Class.forName()`方法加载Servlet类,并通过`newInstance()`创建对象。 2...
为了在服务器上运行Servlet,我们需要一个Web容器,如Tomcat或Jetty,这些容器能加载并管理Servlet实例。 对于这个例子,我们可以推测它可能包含以下步骤: 1. **创建Servlet**:首先,开发者会编写一个Java类,...
Servlet的基本运行方式如下:当第一个HTTP请求到达时,Servlet容器创建Servlet实例,并启动一个线程来处理请求。后续的请求,Servlet容器会重用已有的Servlet实例,为每个请求启动新的线程,这样可以避免频繁的实例...