Servlet生命周期,Servlet是否线程安全? 为什么?


一、什么是Servlet?

        servlet用于接收客户端请求,运行于服务器端的java程序,可以生成动态页面对客户端的请求作出相应。

二、servlet的生命周期

 

1.实例化

当第一次收到客户端传来的请求时,servlet容器就会创建一个servlet实例;

2.初始化

servlet容器通过调用init()方法初始化servlet,初始化只会执行一次;在Servlet容器中,一个Servlet实例只初始化一次,如果多个用户同时请求同一个URL,那么用户访问的是同一个Servlet实例。

3.服务

服务器响应客户端,容器就会调用service()方法,只要该对象存在,service()方法就会被多次调用;每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(get、post 等),并根据实际情况调用 doGet、doPost等方法。

4.销毁

容器会调用destroy()方法对servlet进行销毁,这个方法只会被调用一次;

三.线程安全性

servlet是线程不安全的:

        在Servlet容器中,一个Servlet实例只会被初始化一次,如果多个用户同时请求访问同一个URL,那么用户访问的是同一个Servlet实例。这个servlet实例是唯一的,无论多少用户访问Servlet,都共用这一个实例。而每次用户访问Servlet时,服务器都会为每个用户创建一个独立的线程,每个线程都有它自己的堆栈空间。当访问同一资源的用户过多时,就容易出现多线程并发问题。所以servlet是单实例多线程。

        好处:1.降低了对系统的资源需求,

                2.提高了系统的并发量及响应效率

        缺点:会引发线程安全问题

 


总结

要解决servlet线程不安全性,可以通过取消Servlet的实例变量,将其变成无状态的Servlet。另外一种方法是通过使用synchronized 关键字对共享数据进行同步操作,保证一次只有一个线程可以访问。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值