Servlet是单例的,一般Tomcat服务器负责加载我们的Servlet,它会把这个类加载到方法区,同时创建他的对象放到堆里面,但是他只会创建一遍,因此无论你在浏览器中刷新多少次,内容一般都不会变化。
下面的切记:
JavaEE应用程序运行在一个多线程的环境中!对于每个从客户端过来的HTTP请求,应用服务器都会有一个对应的线程去处理!
如果有多个请求到达服务器,服务器会同时启动多个线程去处理这些请求服务器可能会借助于线程池技术来降低创建线程的开销以提高性能,所以,同一个Servlet对象的服务方法(比如doGet方法),有可能同时被多个线程访问,因此,请编写线程安全的代码
因为Servlet是单例的,所以,对Servlet的成员变量、方法区中的资源(比如静态变量)、外部的资源(比如文件等)进行修改时,要特别小心!如果仅仅是读取(而不是修改),则不必担心线程安全问题
Servelt对象是在第一个请求到达的时候被创建的,以后,每次请求,不再创建新的对象,而是使用一开始创建好的那个对象
。Servlet对象,是由JAVA EE应用服务器,更准确的说,是由Web Container(Web容器)负责创建的
!Web Container是JAVA EE应用服务器的一部分!其实Tomcat也是一个web容器。当Servlet对象被创建的时候,容器会调用它的init()方法,我们可以重写父类的这个方法即可。reload或应用服务器关闭的时候,容器会调用Servlet的destroy()方法。
应用服务器启动的时候初始化(load-on-startup参数):
负数或不配置,则意味着顺序不固定,一般就是第一次访问的时候初始化;
正数或0,表示在部署或应用服务器启动的时候初始化,数字越小,表示会优先加载(按顺序从小到大依次加载和初始化).
init(config参数)方法针对Servlet中的成员变量(指的是config参数设置进去的param参数)是线程安全的。
Servlet生命周期与线程安全
本文解析了Servlet的单例特性及其生命周期管理,强调了在多线程环境下编写线程安全代码的重要性,并介绍了Servlet对象的创建时机及初始化过程。
1749

被折叠的 条评论
为什么被折叠?



