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

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

  • 相关阅读:
    redis-trib.rb命令详解
    Azure 网站上的 Java
    好消息
    Microsoft Azure 上的自定义数据和 Cloud-Init
    关于虚拟机的博客
    cocos2dx CCControlSlider
    cocos2dx CCControlSwitch
    cocos2dx CCEditBox
    cocos2dx CCTextFieldTTF
    cocos2dx 字体BMFont,Atlas
  • 原文地址:https://www.cnblogs.com/yslf/p/10748989.html
Copyright © 2011-2022 走看看