• Servlet的单例模式


    servlet的单例模式
      servlet 在容器中是单例模式存在的,只会创建一个.
      每次用户发送了请求到容器,容器就会从线程池中分配一个线程给这个请求,请求完毕之后线程将会再次回收到池中,
      多个线程同时访问一个 servlet, 就会存在安全风险

    Demo: 避免 servlet 安全风险
    第一种方式: 创建单线程的 servlet (使用servlet 的单线程创建模式)
      之后 servlet, 就同一时间只能一个线程访问 (一个用户访问),
      其他用户需要排队访问 servlet, 但这种方式不能使用

     1 @SuppressWarnings("serial")
     2 public class EmpServlet extends HttpServlet implements SingleThreadModel{
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         try {
     6             TimeUnit.SECONDS.sleep(10);
     7         } catch (InterruptedException e) {
     8             e.printStackTrace();
     9         }
    10         System.out.println(Thread.currentThread().getName() + "线程正在使用 servlet");
    11     }
    12 }

    第二种方式:在方法中使用同步代码块
      和第一种方式一样,也不能使用

     1 @SuppressWarnings("serial")
     2 public class EmpServlet extends HttpServlet{
     3     @Override
     4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     5         synchronized (this) {
     6             System.out.println(Thread.currentThread().getName() + "线程正在使用 servlet");
     7             try {
     8                 TimeUnit.SECONDS.sleep(5);
     9             } catch (InterruptedException e) {
    10                 e.printStackTrace();
    11             }
    12         }
    13     }
    14 }

    第三种方式: 避开 servlet 中定义实例变量
      如果需要使用到变量就在方法中定义为局部变量,此时就不存在数据共享问题

    总结:
      第三种方案是推荐的, 第一二种方案会导致访问的速度风场慢, 需要线程同步(排队等待)

  • 相关阅读:
    编程思想之正则表达式
    SQL查询顺序
    hibernate inverse属性的作用
    介绍一下Hibernate的二级缓存
    JSON数据
    你没玩过的全新版本!Win10这些骚操作你知多少
    VSCode 小鸡汤 第01期
    Editor REST Client
    k8s常用命令
    【项目3-2】多肉植物网站
  • 原文地址:https://www.cnblogs.com/yslf/p/10748989.html
Copyright © 2020-2023  润新知