zoukankan      html  css  js  c++  java
  • Servlet单例非安全解析

    Servlet容器默认是采用单实例多线程的方式处理多个请求

    Servlet容器<Web容器<应用服务器?apache<tomcat<websphere

    Servlet不是线程安全的。

    线程安全,指的是在多线程环境下,一个类在执行某个方法时,对类的内部实例变量的访问安全与否。

    要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的。

    当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。

    要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。

    设计线程安全的程序:

    1、实现 SingleThreadModel 接口(不推荐使用)

    public class ThreadSafeServlet extends HttpServlet implements SingleThreadModel

    2、同步对共享数据的操作

    使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中的Servlet可以通过同步块操作来保证线程的安全。(处理客户请求的吞吐量降低,而且很多客户处于阻塞状态)

    1
    2
    3
    4
    5
    6
    7
    Synchronized (this){ //同步代码块使用代替注解在方法上。
    Output = response.getWriter ();
    Try {
    Thread. Sleep (5000);
    } Catch (Interrupted Exception e){}
    output.println("用户名:"+Username+"<BR>");
    }

    3、只要在Servlet里面的任何方法里面都不使用全局静态变量和实例变量,那么该Servlet就是线程安全的。(使用局部变量);

    public static String name = "Hello";   //静态变量,可能发生线程安全问题
    int i;  //实例变量,可能发生线程安全问题

    1
    2
    String user = "";
    user = request.getParameter("user");

    PS: Servlet并非只是单例的. 当container开始启动,或是客户端发出请求服务时,Container会按照容器的配置负责加载和实例化一个Servlet(也可以配置为多个,不过一般不这么干).不过一般来说一个servlet只会有一个实例。 1) Struts2的Action是原型,非单实例的;会对每一个请求,产生一个Action的实例来处理。 2) Struts1的Action,Spring的Ioc容器管理的bean 默认是单实例的. Struts1 Action是单实例的,spring mvc的controller也是如此。因此开发时要求必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 Spring的Ioc容器管理的bean 默认是单实例的。 Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)。 当Spring管理Struts2的Action时,bean默认是单实例的,可以通过配置参数将其设置为原型。(scope="prototype )



     

     

  • 相关阅读:
    paip.关于动画特效原理 html js 框架总结
    paip.utf-8,unicode编码的本质输出unicode文件原理 python
    paip.多维理念 输入法的外码输入理论跟文字输出类型精髓
    paip.前端加载时间分析之道优化最佳实践
    paip.输入法编程--英文ati化By音标原理与中文atiEn处理流程 python 代码为例
    paip.导入数据英文音标到数据库mysql为空的问题之道解决原理
    paip.元数据驱动的转换-读取文件行到个list理念 uapi java php python总结
    paip.python3 的类使用跟python2 的不同之处
    paip.日志中文编码原理问题本质解决python
    paip.性能跟踪profile原理与架构与本质-- python扫带java php
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9202786.html
Copyright © 2011-2022 走看看