对象的生命周期,就是对象从出生到死亡的过程。即:出生 -> 活着 -> 死亡。官方说法是对象创建到销毁的过程!
1,出生:请求第一次到达 Servlet 时,对象就创建出来,并且初始化成功。只出生一次,将对象放到内存中。
2,干活:服务器提供服务的整个过程中,该对象一直存在,每次都是执行 service 方法。
3,死亡:当服务停止时,或者服务器宕机时,对象死亡。
结论:Servlet 对象只会创建一次,销毁一次。所以 Servlet 对象只有一个实例。如果一个对象实例在应用中是唯一的存在,那么我们就称它为单例模式。
由于 Servlet 采用的是单例模式,也就是整个应用中只有一个实例对象。所以我们需要分析这个唯一的实例对象中的类成员是否线程安全。
而Servlet 是线程不安全的!
解决:定义类成员要谨慎。如果是共用的,并且只会在初始化时赋值,其他时间都是获取的话,那么是没问题的。如果不是共用的,或者每次使用都有可能对其赋值,那就要考虑线程安全问题了,可以将其定义到 doGet 或 doPost 方法内或者使用同步功能即可。