Servlet的多线程和线程安全
Servlet的多线程和线程安全
Servlet的生命周期
1.Servlet的生命周期有四个阶段:加载并实例化、初始化、请求处理、销毁。
加载并实例化
1.Servlet容器(如:Tomcat)负责加载和实例化Servelt。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。
2.当Servlet容器启动后,Servlet容器通过类加载器来加载Servlet类,加载完成后再new一个Servlet对象来完成实例化。
初始化
1.在Servlet实例化之后,容器将调用init()方法,并传递实现ServletConfig接口的对象。
2.在init()方法中,Servlet可以部署描述符中读取配置参数,或者执行任何其他一次性活动。在Servlet的整个生命周期类,init()方法只被调用一次。
请求处理
1.当Servlet初始化后,容器就可以准备处理客户机请求了。
2.当容器收到对这一Servlet的请求,就调用Servlet的service()方法,并创建HttpSevletRequest和HttpServletResponse对象作为参数传递。
3.当并行的请求到来时,多个service()方法能够同时运行在独立的线程中。通过分析ServletRequest或者HttpServletRequest对象,service()方法处理用户的请求,并调用ServletResponse或者HttpServletResponse对象来响应。
销毁
1.一旦Servlet容器检测到一个Servlet要被卸载,这可能是因为要回收资源或者因为它正在被关闭,容器会在所有Servlet的service()线程之后,调用Servlet的destroy()方法。
Servlet是线程安全的吗?
1.Servlet本身是无状态的,一个无状态的Servlet是绝对线程安全的,无状态对象设计也是解决线程安全问题的一种有效手段。
2.servlet是否线程安全是由它的实现来决定的,如果它内部的属性或方法会被多个线程改变,它就是线程不安全的,反之,就是线程安全的。
3.Servlet如果没有共享数据的访问就是线程安全