栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

 

一、生命周期四个阶段

1.1 实例化

1.2 初始化

1.3 服务

1.4 销毁

1.5 代码

二、特性

2.1线程安全问题

2.2 如何保证线程安全

2.3 实现


一、生命周期四个阶段

1.1 实例化

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

1

注意:只执行一次

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、实现singleThreadModel接口

3、使用局部变量

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号