Servlet生命周期以及Servlet是线程是否安全?

发布于:2022-12-07 ⋅ 阅读:(682) ⋅ 点赞:(0)

        大家在第一次把Web项目发布到浏览器上,应该是通过Servlet来实现的,而它在我们Web项

目中确是占着举足轻重的地位,接下来我先介绍一下Servlet.

          它是运行在服务器端的Java程序,可以接收客户在浏览器端发出的请求, 并且在服务器端

做出响应,这就是Servlet.

           注意:有请求才会有响应,服务器端不会无缘无故给出响应!

           明白了它的含义与作用,我们更需要知道它的生命周期:

           1.首先实例化,也就是它的生命开始,通过Servlet容器创建Servlet对象

           2.而后要给它初始化,用Servlet容器调用 init ( ServletConfig ) 方法

           3.接下来它要去工作了,收到请求,容器调用Service方法

           4.最后消亡,容器调用destroy方法

           Servlet生命周期阐述完了之后,我们来了解Servlet线程是否安全,首先我提及一点,

Servlet它是接收请求并做出响应的,但每个Servlet在Tomcat中只有一个实例对象,服务器只有一

个,而客户端有N个,那么从客户端请求服务器时,数据必然会发生共享,从而导致数据不一致的

情况,产生线程不安全问题

           犹如,张三李四买电影票,当只有最后一张了,且不论他俩是否在买票过程中不出问题,最

重要的是他们如果都买到了最后一张票,那进电影院谁坐下来看电影呢

                

           既然有了问题,就要去解决,我提供了以下三种解决方案:

           1.实现 SingleThreadModel 接口

           倘若一个Servlet实现了此接口,那么在Servlet容器中调用Service方法将保证在一个时间点

仅有一个线程执行,其他请求进行排队,从而不会有两个线程同时执行,解决了线程安全问题,不

过缺点是效率不高

           2.同步对共享数据的操作

           使用synchronized 关键字能保证一次只有一个线程可以访问被保护的地方,让Servlet程序

有条有理运行,可以通过同步块操作来保证线程的安全,但客户的其他请求也会因此而停滞阻塞   

        

           3.尽量不使用实例变量

      线程安全问题更是由实例变量造成的,只要在Servlet里面的方法里面不使用实例变量,那

么该Servlet就是线程安全的,实例变量可以改用局部变量。

          其实变量就是字段和共享数据,以及表单的参数值,根据多线程不共享局部变量的特点,可

以把变量本地化,问题也就迎刃而解了

          例:String users = " " ;    users = request.getParameter("users");

          注:第1,2种方式可以了解,作参考,相比之下比较建议第3种,具体根据情况而定

总结:

         线程安全问题主要是由实例变量造成的 , 所以在Servlet中能不使用实例变量,就不使用。

        假设程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保

证系统的最佳性能,在使用同板块时要尽可能的缩小同步代码范围,更不要直接在sevice方法

和响应方法上使用同步

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到