zoukankan      html  css  js  c++  java
  • 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 中定义实例变量
      如果需要使用到变量就在方法中定义为局部变量,此时就不存在数据共享问题

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

  • 相关阅读:
    第4天--linux内核学习
    make menuconfig出错,需要安装libncurses5-dev找不到文件的终极解决办法(不必更换源,适用于ubuntu 32位平台)
    uboot学习第一天
    与或左移右移操作在ARM寄存器配置中的作用
    第四天网络编程笔记
    socket编程热身程序
    线程的创建pthread_create.c
    json.dumps与json.dump的区别 json.loads与json.load的区别
    解决在Vim中鼠标右键不能粘贴
    Python with语句
  • 原文地址:https://www.cnblogs.com/yslf/p/10748989.html
Copyright © 2011-2022 走看看