servlet的生命周期很简单,需要注意的是,servlet是单例的,即servlet容器只会保留一个servlet的实例。客户端发起http请求时,servlet容器找到对应的servlet,如过容器有该servlet的实例,就会重新启动一个线程,去执行servlet。如过没有实例,就会创建该servlet的实例,这期间会调用servlet的init方法,也就是说,servlet的init方法在其生命周期内只会被调用一次。
那么问题来了,serlvet是单例的,是否是线程安全的呢?
答案是否定的,如果servlet中用到实例变量的话,在高并发的情况下,会引起共享数据的问题。
如何解决呢?
1.实现SingleThreadModel协议,这种方式会对每一次请求都生成一个实例,导致性能下降,不推荐使用
2.对实例变量加锁,这虽然能解决多线程数据共享的问题,但会引起其他线程阻塞,降低系统的吞吐量
3.不使用实例变量。这是最根本的解决办法,推荐使用。