`
neptune
  • 浏览: 357610 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

spring的DispatcherServlet不是线程安全的.

阅读更多
大概看了一下tomcat实例化servlet的源代码,和spring mvc的DispatcherServlet的源代码,现在问题来了,spring的DispatcherServlet不是线程安全的.

我看的源代码版本是:tomcat 7.0.57 spring 3.0.5. 重点查看了org.apache.catalina.core.StandardWrapper和DispatcherServlet的源代码。

为什么说DispatcherServlet不是线程安全(有可能不可见)现在问题如下:

StandardWrapper是Servlet的包装类,其内有个protected volatile Servlet instance = null;属性,存放的servlet的实例,这个实例使用标准的双检查锁来实例化和初始化,初始化的时候在synchronized(this)的同步块内,调用 servlet.init(facade);因为在synchronized同步块内,其可以保证在同步块结束后所有对成员变量的修改都会刷新(写回)到主内存。

说到上面的servlet.init(facade);我们现在来切换到DispatcherServlet类,这个类继承于FrameworkServlet -> HttpServletBean -> HttpServlet,DispatcherServlet的initStrategies(ApplicationContext context),也是在servlet.init(facade)方法内的调用,因此也在synchronzied同步块内调用,因此其可以保证initStrategies方法对DispatcherServlet实例成员变量的修改后刷新到主内存。

我们再来看看DispatcherServlet的一些成员变量的声明,都是普通的声明,前都没有用final和volatile修饰:

/** MultipartResolver used by this servlet */
private MultipartResolver multipartResolver;

/** LocaleResolver used by this servlet */
private LocaleResolver localeResolver;

/** ThemeResolver used by this servlet */
private ThemeResolver themeResolver;

/** List of HandlerMappings used by this servlet */
private List handlerMappings;

/** List of HandlerAdapters used by this servlet */
private List handlerAdapters;

/** List of HandlerExceptionResolvers used by this servlet */
private List handlerExceptionResolvers;

/** RequestToViewNameTranslator used by this servlet */
private RequestToViewNameTranslator viewNameTranslator;

/** FlashMapManager used by this servlet */
private FlashMapManager flashMapManager;

/** List of ViewResolvers used by this servlet */
private List viewResolvers;

现在就要问题的实质了,doDispatch(HttpServletRequest request, HttpServletResponse response)方法,在没有任何同步的情况下,使用上面这些属性的实例,可见性能保证吗?
分享到:
评论

相关推荐

    springboot2 配置多个DispatcherServlet 处理.do .htm请求,Controller分离,集成druid和mybatis

    Springboot 2.4.4 网上搜到的配置多个DispatcherServlet 都有坑,自己避坑写的一个demo,处理.do .htm请求,Controller分离不会出现一个Controller可以处理.do也处理.htm可自己扩展.action .json等,适合分离前台...

    spring的jar包解决:DispatcherServlet

    org.springframework.web.servlet.DispatcherServlet java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet at org.apache.catalina.loader.WebappClassLoader.loadClass ...

    Manning.Spring.in.Action.4th.Edition.2014.11.epub

    Praise for the Third Edition of Spring in Action Preface Acknowledgments About this Book 1. Core Spring Chapter 1. Springing into action 1.1. Simplifying Java development 1.1.1. Unleashing the power ...

    spring-boot-reference.pdf

    Spring Boot Documentation 1. About the Documentation 2. Getting Help 3. First Steps 4. Working with Spring Boot 5. Learning about Spring Boot Features 6. Moving to Production 7. Advanced Topics II. ...

    Spring面试题含答案.pdf

    26. Spring 框架中的单例 bean 是线程安全的吗? 27. 解释 Spring 框架中 bean 的生命周期 28. 哪些是重要的 bean 生命周期方法? 你能重载它们吗? 29. 什么是 Spring 的内部 bean? 30. 在 Spring 中如何注入一个...

    spring MVC 配置文档

    org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> 加载 DispatcherServlet 时 Spring 会尝试读取配置文件 默认的配置文件位于 web.xml...

    org.springframework.web.servlet-3.1.0.RELEASE

    * by a DispatcherServlet. The view can take the form of a String * view name which will need to be resolved by a ViewResolver object; * alternatively a View object can be specified directly. The ...

    精通Spring.MVC

    How to develop with the DispatcherServlet How to write Controllers How to work with Resolving and Implementing Views What are the supported View Types How to customize your website What is and how to ...

    Pivotal Certified Spring Web Application Developer Exam(Apress,2015)

    Prepare for the Pivotal Certified Spring Web Application Developer exam and learn about Spring MVC DispatcherServlet configuration, Spring MVC programming model essentials, Spring MVC views and form ...

    Spring框架系列(13) - SpringMVC实现原理之DispatcherServlet的初始化过程.doc

    Spring框架系列(13) - SpringMVC实现原理之DispatcherServlet的初始化过程.doc

    apache-tomcat-7.0.69.zip

    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) at org....

    spring-framework-reference-4.1.2

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    springboot参考指南

    关闭Spring MVC DispatcherServlet vii. 65.7. 关闭默认的MVC配置 Spring Boot参考指南 7 viii. 65.8. 自定义ViewResolvers v. 66. 日志 i. 66.1. 配置Logback ii. 66.2. 配置Log4j i. 66.2.1. 使用YAML或JSON配置...

    Spring中文帮助文档

    13.2. DispatcherServlet 13.3. 控制器 13.3.1. AbstractController 和 WebContentGenerator 13.3.2. 其它的简单控制器 13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping...

    Spring API

    13.2. DispatcherServlet 13.3. 控制器 13.3.1. AbstractController 和 WebContentGenerator 13.3.2. 其它的简单控制器 13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    注意:经常被使用的的Spring的DispatcherServlet也是Spring Web MVC框架中的一部分。因此,就算你只是为了远程访问(例如,暴露Hessian或者 HTTP调用服务)而使用DispatcherServlet,你也得将'spring-webmvc.jar'...

    SPRING API 2.0.CHM

    DispatcherServlet DispatcherServletWebRequest DisposableBean DisposableBeanAdapter DisposableSqlTypeValue DocumentLoader DomUtils DriverManagerDataSource DynamicDestinationResolver ...

    spring-framework-reference4.1.4

    3. New Features and Enhancements in Spring Framework 4.0 ............................................ 17 3.1. Improved Getting Started Experience .........................................................

    Spring 2.0 开发参考手册

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...

    spring-webmvc5.3.6 jar包.rar

    org.springframework.web.servlet.DispatcherServlet ) spring-webmvc 是 Spring MVC 的一个实现。spriing-webmvc 依赖于 spring-web如果直接使用spring-webmvc,就会隐式地添加 spring-web。不必显示添加 spring-...

Global site tag (gtag.js) - Google Analytics