0


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



提示:以下是本篇文章正文内容,下面案例可供参考

一、servlet是什么?

    Servlet是在服务器端运行的Java程序,可以接收客户端请求并通过服务器做出响应,并且Servlet可以**动态**生成HTML内容对客户端进行响应。

二、servlet的生命周期简述

servlet的生命周期大致可以分为四个阶段,

  1. 实例化:Servlet容器创建Servlet的实例
  2. 初始化:该容器调用init(ServletConfig)方法
  3. 服务:如果请求Servlet,则容器调用service()方法
  4. 销毁:销毁实力之前调用destroy()方法

1.servlet实例化阶段

    在服务器启动时(web.xml中配置的load-on-startup =1,默认为0)或者第一次请求改servlet时,其实在服务器运行之处便会加载类也就会实例化servlet对象,这个可以在监视其中对其进行监测
@WebListener
public class demolistener implements ServletContextListener {

    
    public void contextDestroyed(ServletContextEvent sce)  { 
         System.out.println("我被销毁了");
    }

    
    public void contextInitialized(ServletContextEvent sce)  { 
        
         System.out.println("我被创建了");
    }
    
}
  初始化阶段,开始执行doGet()中的方法
@WebServlet("/demo.do")
public class cc2 extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    public void init(ServletConfig config) throws ServletException {
        System.out.println("SerVlet初始化了");
    }
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        System.out.println("开启服务时调用");
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        System.out.println("SerVlet被销毁了");
    }

    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        ServletContext context = request.getServletContext();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

当我们启动项目时,servlet被加载实例化,,当我们访问demo.do时,init()方法被调用,service()服务方法启动。

当我们关闭或者重启时可以通过监测器看到servlet容器被销毁了,至此servlet生命周期结束。


三、Servlet是否为线程安全

1.什么是线程安全?

线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。

首先,我们要有一个概念,在前面的介绍中我就介绍了Servlet 的描述,作为客户端和服务器端的交互者,一个服务器往往对应着多个客户端,网络的共享性,也说明,servlet一定是线程不安全的。同时,servlet本来就是一个多线程,当第一次请求后,服务器在重启或者关闭之前都不会再次创建servlet,因此,客户端共享一个servlet,当某一时刻多个线程对servlet同时发出请求,会出现访问数据不一致的情况,这样的情况就导致了一系列的线程安全问题。

2. 如何开发线程安全的Servlet

1.变量的线程安全

  **  多线程并不会共享局部变量,这样在我们使用servlet的过程中合理的使用局部变量可以有效的避免线程安全问题,**

2.同步块的锁机制(synchronized)

    **在javaSE中我们就已经知道了面对线程安全问题,我们开发出了大量的锁来对线程执行次序进行规划,那么,在servlet中我们依旧可以使用同步块来应对线程安全问题,但是在使用时我们应该尽量的缩小同步块控制的范围,尽量不要再service中使用synchronized,因为在使用了同步块后,我们的程序有可能面临大量的阻塞队列,这样会极大的影响程序的执行效率**。

3.只要Servlet实现SingleThreadModel接口,

public class demoSerVlet extends HttpServlet implements SingleThreadModel { 
   
}
**    使用这个接口,这个接口会在每次请求的时候创建一个servlet实例,此接口并没有方法,和Serializable一样属于标识接口,但是此接口的使用中,可以看出,他会创建过多的servlet实例,一个servletContext在多线程访问时,每个servlet最多只能支持20个线程并发访问,可能会同时挂起20多个线程**

当然,这三种方法并不能解决所有的线程问题,并且都含有一定的缺点,再平常编程过程中需要及时的判断合适的使用场景。合理使用。


总结

    **Servlet****是在服务器上运行的小程序(Servlet=Service + Applet)。Servlet其实是一个用Java语言定义的接口,但一般情况下说的Servlet是指直接或间接实现了这个Servlet接口的类。服务器上需要一些程序。而与传统的 CGI相比JavaServlet效率更高,Servlet带给我们最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。了解servlet的生命周期和线程安全问题,也是学习servlet的一部分。**
标签: servlet java 服务器

本文转载自: https://blog.csdn.net/m0_65004039/article/details/127015990
版权归原作者 来日方长。。。。long 所有, 如有侵权,请联系我们删除。

“描述Servlet生命周期,Servlet是线程安全的吗? 为什么?”的评论:

还没有评论