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# Array或List有个很实用的ForEach方法,可以直接传入一个方法对集合中元素操作
    js 检查字符串中是否包含中文(正则)
    Js 数组对象排序
    Js日期处理
    JS 检测字符串是否还有某个字符
    js获取URL传参
    使用JavaScript修改浏览器URL地址栏的实现代码
    上传、裁剪图片-----Jcrop图片裁剪插件
    zip拉链方法
    内置函数如help()...
  • 原文地址:https://www.cnblogs.com/yslf/p/10748989.html
Copyright © 2011-2022 走看看