描述Servlet生命周期,Servlet是线程安全的吗?为什么?

Servlet生命周期的四个阶段

1.实例化servlet对象:Servlet 容器创建 Servlet 的实例

有两种方式:1):通过配置文件web.xml进行实例化

                      2):注解

2.初始化参数配置: 该容器调用 init ( ServletConfig ) 方法 

servlet实例化后就会调用init方法,只能调用一次,且是在进行第一次实例化servlet对象时调用。当用户在调用servlet时,就会创建一个servlet实例,每一次在客户端发送的请求servlet就会产生一个新的线程,从而调用对应的doGet 或 doPost 方法。

配置参数的方式有两种:1):通过配置文件web.xml方式配置

                                        2):通过注解方式配置

3.服务:如果请求 Servlet,则容器调用 service() 方法

service()方法是执行实际任务的主要方法,Web服务器将调用service方法处理客户端(浏览器)的请求,然后将格式化的数据响应给浏览器客户端。每当客户端向服务端发送一个请求时,服务端都会产生一个新的线程调用服务。调用service方法中的 doGet、doPost、doPut进行实际的业务逻辑进行处理。

4.销毁:销毁实例之前调用 destroy() 方法

servlet生命周期结束时将会调用destroy()方法,并且只会调用一次。destroy方法可以让我们的servlet关闭数据库连接,把后台线程关闭,清楚Cookie数据等。当调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除。

Servlet不是线程安全的。

当Tomcat接收到HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。而每一个Servlet对象在Tomcat容器中只有一个实例对象,即单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。

9bbb873130986fabac6c49dff49c5a23.png

上图中的Thread1和Thread2调用了同一个Servlet1,所以此时如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题(因为所有的线程都可能使用这些变量)。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值