0
点赞
收藏
分享

微信扫一扫

Servlet学习日记8——Servlet的生命周期和线程安全

云上笔记 2022-02-13 阅读 54

目录

一、生命周期四个阶段

1.1 实例化

1.2 初始化

1.3 服务

1.4 销毁

1.5 代码

二、特性

2.1线程安全问题

2.2 如何保证线程安全

2.3 实现


一、生命周期四个阶段

1.1 实例化

当用户第一次访问Servlet时,由容器调用Servlet的构造器创建具体的Servlet对象。也可以在容器启动之后立刻创建实例。使用如下代码可以设置Servlet是否在服务器启动时就创建。

<load-on-starup>1</load-on-starup>

注意:只执行一次

1.2 初始化

在初始化阶段,init()方法会被调用。这个方法在javax.servlet.Servlet接口中定义。其中,方法以一个ServletConfig类型的对象作为参数。

注意:init方法只被执行一次

1.3 服务

当客户端有一个请求时, 容器就会将请求ServletRequest 与响应ServletResponse对象转Servlet,以参数的形式传给service方法。

此方法会执行多次

1.4 销毁

当Servlet容器(Tomcat)停止或者重新启动都会引|起销毁Servlet对象并调用destroy方法。

destroy方法执行一 次

 

1.5 代码

package com.ha.servlet;

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LifeServlet implements Servlet{
    public LifeServlet(){
        System.out.println("1、实例化");
    }

    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2、初始化");
    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3、接收请求,响应结果");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {
        System.out.println("4、销毁");
    }
    
}

 执行shutdown.bat,这个tomcat的窗口里面会一闪而过的打印销毁的内容

二、特性

2.1线程安全问题

Servlet在访问之后,会执行实例化操作,创建一个Servlet对象。 而我们Tomcat容器可以同时多个线程并发访问同一个Servlet,如果在方法中对成员变量做修改操作,就会有线程安全的问题。

代码解释,两个人以上同时访问:

package com.ha.servlet;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class SafeServlet extends HttpServlet {
    private String message = "";

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //假设1、接收参数
        //2、调用业务逻辑 得到登录结果
        message = "登录成功";//登录失败!
        PrintWriter printWriter = resp.getWriter();
        printWriter.println(message);

    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

2.2 如何保证线程安全

1、synchronized

        将存在线程安全问题的代码放到同步代码块中

2、实现singleThreadModel接口

        servlet实现singleThreadModel接口后, 每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题,但是servlet响应客户端请求的效率太低,所以已经淘汰。

3、尽可能使用局部变量

2.3 实现

1、如果使用锁

代码的效率就会很低,只允许一个人访问 

2、

3、

 

 

举报

相关推荐

0 条评论