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

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

  • 相关阅读:
    C语言堆栈入门——堆和栈的区别
    Unity时钟定时器插件——Vision Timer源码分析之一
    UNITY3D 2D物流流体插件下载|Liquid Physics 2D
    Unity3d插件Master Audio AAA Sound v3.5
    游戏行业的女性拥有强大的新盟友:Facebook
    Unity游戏设计与实现 南梦宫一线程序员的开发实例
    Unity4.6证书激活问题
    里诺全系列注册机+暗桩patch
    冰点还原8.53破解版
    NSE: known a priori estimate
  • 原文地址:https://www.cnblogs.com/yslf/p/10748989.html
Copyright © 2011-2022 走看看