大概看了一下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)方法,在没有任何同步的情况下,使用上面这些属性的实例,可见性能保证吗?
分享到:
相关推荐
此外,它还利用了Concurrent包中的线程安全集合,以支持多线程环境下的应用开发。 6. **JDBC and JPA**:Spring的Data Access/Integration模块涵盖了JDBC和Java Persistence API(JPA),提供了一套全面的数据库...
3. **深入Spring MVC**:分析`DispatcherServlet`的请求处理流程,以及`HandlerMapping`和`HandlerAdapter`的角色。 4. **探究数据访问模块**:查看Spring如何与JDBC、ORM框架集成,以及事务管理的实现。 5. **注解...
在4.3.2版本中,Spring团队对框架进行了性能优化,包括更快的启动速度、内存占用减少,以及对多线程环境的优化,提升了整体运行效率。 9. **兼容性与社区支持**: Spring 4.3.2.RELEASE保持了对旧版本API的良好...
4. **MVC组件**:Spring MVC的DispatcherServlet、HandlerMapping、Controller等关键组件的源码,揭示了请求处理的流程和映射机制。 5. **事务管理**:Spring的PlatformTransactionManager接口和不同的事务策略(如...
- **DispatcherServlet**:Spring MVC的入口,负责接收请求,分发到相应的处理器。 - **Controller**:控制器接口,定义了处理请求的方法。 - **Model-View-Model**:模型-视图-模型,用于处理业务逻辑、数据展示...
- **依赖注入**:利用Spring的依赖注入机制,将状态管理委托给线程安全的Bean。 - **使用ThreadLocal**:对于需要在不同请求间保持状态的场景,可以通过ThreadLocal来存储临时的状态信息。 #### 二、SpringMVC框架...
8. 高效性能:通过DispatcherServlet的线程安全性和请求局部性,保证了高并发下的性能。 三、Spring MVC 重要组件 1. DispatcherServlet:前端控制器,接收并分发请求。 2. HandlerMapping:处理器映射器,根据请求...
相较于 CGI,Servlet 更加高效,因为每个请求仅启动一个线程(并使用线程池),且可以利用 JavaEE 的其他技术。 - **问题**:早期的 Servlet 实践中,控制逻辑、表现逻辑和业务逻辑常常混杂在一起,导致代码难以维护...
在每个线程中,Spring Security通过`SecurityContextHolder`来获取或设置`Authentication`对象。 二、Spring Security配置 Spring Security的配置可以通过XML、Java配置或者使用`@EnableWebSecurity`注解的自定义...
2.1. 线程 ...................................................................................................................................................... 20 2.2. JVM 内存区域 .....................
例如,如果项目中有`spring-web`依赖,Spring Boot就会自动配置一个DispatcherServlet。 **二、起步依赖** Spring Boot通过起步依赖(Starter POMs)使得添加特定功能变得极其简单。例如,`spring-boot-starter-web...
9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML...
源码中的注释和设计模式的使用,可以帮助理解Spring如何处理各种常见的编程挑战,如并发、线程安全和资源管理。 6. **企业级应用开发**:在企业级环境中,Spring3.x提供了诸如事务管理、数据访问抽象、安全性、消息...
Web 安全部分介绍了如何在 Spring MVC 应用程序中处理安全性问题,比如如何定制化错误页面和使用 Web 安全相关的注解。 "约定优于配置"是 Spring 提倡的设计理念之一,文档中提及了这一理念如何在 Spring MVC 中...
同时,Spring框架提供的线程池功能则可以帮助我们优化多线程环境下的性能,特别是处理并发请求时。在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 ...
Spring MVC的控制器默认采用单例模式,这意味着在多线程环境下可能存在线程安全问题。解决办法是避免在控制器中定义可变状态的成员变量,或者使用线程安全的方式来管理这些变量。 Spring MVC与Struts2的主要区别...
例如,以下配置会引入 Spring Security 的 DispatcherServlet 和 Filter: ```xml <filter-name>springSecurityFilterChain <filter-class>org.springframework.web.filter.DelegatingFilterProxy ...
- SqlSessionTemplate:MyBatis-Spring提供的一个线程安全的SqlSession实现,可以替代直接使用SqlSession,避免了手动管理SqlSession的生命周期。 - MapperFactoryBean:用于将MyBatis的Mapper接口与XML配置文件...
Spring的单例Beans在多线程环境下并不是线程安全的,开发者需要自行处理线程安全问题,比如使用局部变量、同步机制等方式。 SpringBoot是Spring的一个子项目,它提供了快速搭建和配置Spring应用的方式,简化了基于...
2. **SessionFactory和Session**:SessionFactory是线程安全的,负责创建Session实例,而Session是数据库会话,用于执行CRUD操作。 3. ** Criteria 和 HQL 查询**:Hibernate提供了Criteria API和HQL(Hibernate ...