关于servlet的生命周期和线程的安全性

生命周期:

Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由其运行的WEB容器负责的,具体是指Servlet

1实例化(被创建)

2初始化init()

3处理请求service() --doGet()和,

4最后销毁destory()的过程

线程安全性:

当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。这样的话,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致,所以就很容易造成一系列的一些安全性问题。

解决此问题的方法:

  1、实现 SingleThreadModel 接口

  该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要继承这个接口就行了

  public class XXXXX extends HttpServlet implements SingleThreadModel { ………… }

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

  使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中可以通过同步块操作来保证Servlet的线程安全。同步后的代码如下:

  Public class XXXXXX extends HttpServlet { ………… synchronized (this){XXXX} }

  3、避免使用实例变量

  线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。

原文地址:https://www.cnblogs.com/besthetiao/p/4513282.html