Servlet对象的生命周期

来源:互联网 发布:更改mac屏幕下面的图标 编辑:程序博客网 时间:2024/06/05 07:33

l  当用户第一次访问Tomcat服务器的时候,假如发送的请求是/empQuery,Tomcat服务器会在整个容器中搜索/empQuery对应的Servlet对象,发现这个Servlet对象没有实例化,于是从web.xml文件中获取/empQuery对应的完整Servlet类名,通过反射机制调用Servlet类的无参数构造方法实例化该Servlet对象,然后调用该对象的init方法完成Servlet对象初始化,随后启用一个线程调用Servlet对象的service方法提供服务。

l  当用户第二(+)次访问Tomcat服务器的时候,同样也发送了/empQuery请求,此时Tomcat服务器还是在容器中搜索/empQuery对应的Servlet对象,结果找到了该对象的实例,启用一个线程调用该对象的service方法提供服务。

l  当用户长时间没有再发送/empQuery请求,或者Tomcat服务器关闭的时候,或者项目重新部署的时候,Tomcat容器会回收Servlet对象所占用的内存,在回收该Servlet对象之前,会自动调用该Servlet对象的destroy方法做好回收内存之前准备。

l  结论:

n  Servlet对象第一次被创建之后init方法执行,并且init方法只执行一次,主要目的完成对象的初始化工作。(init方法的执行的时候Servlet对象已经创建)

n  Servlet对象的service方法,只要用户请求一次,service方法就执行一次。

n  Servlet对象在被回收之前,destroy方法会被调用,该方法也是只执行一次。(destroy方法执行的时候Servlet对象还在)

l  Servlet对象的创建,对象的销毁,对象提供服务等操作必须由WEB容器管理,java程序员是无法干涉Servlet对象生命周期的。javaweb程序员的任务只是将Servlet类编写,并且将其配置到web.xml文件中。换句话说,java程序员不能使用new关键字实例化Servlet对象,java程序员没有权利去调用Servlet对象生命周期的方法。

l  Tomcat容器/WEB容器是如何实例化Servlet对象的?



1、获取用户的请求路径/empQuery 2、解析web.xml文件,获取/empQuery对应的Servlet完整类名:com.bjpowernode.web.servlet.EmpQueryServlet 3、使用反射机制调用无参数构造方法实例化Servlet对象:(一次)              Class c = Class.forName("com.bjpowernode.web.servlet.EmpQueryServlet ");              Servlet servlet = (Servlet)c.newInstance(); 4、实例化ServletConfig对象(一次)              ServletConfig config = ServletConfig对象实例化; 5、调用init方法(一次)              servlet.init(config); 6、实例化request、response对象,调用service方法(多次)              ServletRequest request = 封装request对象;              ServletResponse response = 封装response对象;              servlet.service(request,response); 7、Servlet对象回收之前Tomcat容器调用destroy方法(一次)              servlet.destroy();


l  Servlet对象是单实例多线程的环境下运行的,对于Tomcat服务器来说,每一个用户访问服务器,Tomcat服务器都会分配给用户一个线程去处理本次请求。(Servlet对象多线程共享,如果该对象的内存被修改,则需要注意线程并发带来的线程安全问题),什么时候需要考虑使用线程同步呢?(什么是同步、什么是异步)

n  多线程环境下

n  有共享的数据

n  共享数据涉及到修改操作

l  同步编程模型:t1线程和t2线程之间互相发生了等待,这种编程模型被称作同步编程模型,同步机制会使程序的执行效率降低,但是为了保证共享数据的修改安全,必须牺牲效率,保证安全。(java中有synchronized关键字来保证线程同步,它可以定义同步代码块),为了提高程序的执行效率,同步的代码块应尽可能的小或者少。

l  异步编程模型:t1和t2线程各自执行,互补干扰,这种编程模型是异步编程模型,这才是真正意义多线程并发!

l  多线程共享内存以及独立的内存分别是什么?

n  共享的内存:方法区内存和堆区内存(成员变量/实例变量、静态变量如果在多线程环境下涉及到修改操作需要考虑线程安全问题,因为他们的内存是共享的)

n  独立的内存:一个线程一个独立的栈内存。(局部变量大多数都不会多线程并发带来的安全问题,因为局部变量存储在栈内存中),多个局部变量指向数据库中的数据如果只有一条,也是需要考虑多线程安全问题的。

0 0