Spring并发访问的线程安全性问题

标签: spring 并发 访问 | 发表时间:2013-10-10 17:01 | 作者:windows9834
出处:http://windows9834.blog.163.com
和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。
如:
public class Controller extends AbstractCommandController {   
......
protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,
Object command,BindException errors) throws Exception {
company = ................;
}
protected Company company;
}


在这里有声明一个变量company,这里就存在并发线程安全的问题。
如果控制器是使用单例形式,且controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。。

有几种解决方法:
1、在Controller中使用ThreadLocal变量
2、在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。

相关 [spring 并发 访问] 推荐:

Spring并发访问的线程安全性问题

- - 寒江孤影
和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题.

Spring+MyBatis实践——MyBatis访问数据库

- - 开源软件 - ITeye博客
    在http://dufengx201406163237.iteye.com/blog/2102054中描述了工程的配置,在此记录一下如何使用MyBatis访问数据库;. . .

Nginx并发访问优化

- - CSDN博客推荐文章
    Nginx反向代理并发能力的强弱,直接影响到系统的稳定性. 安装Nginx过程,默认配置并不涉及到过多的并发参数,作为产品运行,不得不考虑这些因素. Nginx作为产品运行,官方建议部署到Linux64位系统,基于该建议,本文中从系统线之上考虑Nginx的并发优化.     1、打开Linux系统epoll支持.

Spring的WebServiceTemplate访问WebService的方法及其本质原理

- - 行业应用 - ITeye博客
WebService客户端调用的本质就是将SAOP格式的XML通过通信协议发送到WebService的服务器端,然后接收服务器端返回的XML.. 本文简单介绍一下如何通过Spring提供的WebServiceTemplate访问 Webservice,WebServiceTemplate与调用webservice的客户端已及webservice服务器端示意图如下(图片来源 于Spring in Action):.

使用SPRING中的线程池ThreadPoolTaskExecutor实现JAVA并发

- - Java - 编程语言 - ITeye博客
//线程池所使用的缓冲队列 . //线程池维护线程的最少数量 . //线程池维护线程的最大数量 . //线程池维护线程所允许的空闲时间 .  .      .      .      .

quartz集群分布式(并发)部署解决方案-Spring

- - 企业架构 - ITeye博客
项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻辑问题,. 比如需要回滚的数据,就回滚了多次,刚好quartz提供很好的解决方案. 集群分布式并发环境中使用QUARTZ定时任务调度,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务.

spring单例在高并发下可能出现的错误

- - 互联网 - ITeye博客
spring单例在高并发下可能出现的错误. spring单例在高并发下可能出现的错误: 首先,只有当注入的对象是无状态的幂等的才可以保证执行前后不被修改,否则执行一次之后单例对象就会发生改变,在下次执行有肯能造成结果不一样,当在高并发的情况下就会出现,这个线程刚使用单例对象进行属性设置,还未使用的情况下,另一个进程已经将单利对象的数据进行修改属性完成,则远来线程获取到的单例就是一个脏对象不可使用.

如何才能做到网站高并发访问

- - 企业架构 - ITeye博客
  高并发访问的核心原则其实就一句话“把所有的用户访问请求都尽量往前推”. 如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部(指挥部就是数据库及分布式存储). 如:能缓存在用户电脑本地的,就不要让他去访问CDN. 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了.

如何模拟超过 5 万用户的并发访问?

- -
来源:http://t.cn/ES7KBkW. 本文将从负载测试的角度,描述了做一次流畅的5万用户并发测试需要做的事情.. 你可以在本文的结尾部分看到讨论的记录.. 使用JMeter进行本地测试. BlazeMeter沙箱测试. 使用一个控制台和一个引擎设置Users-per-Engine的数量. 设置并测试你的集合 (1个控制台和10-14 引擎).

Spring详解

- - CSDN博客架构设计推荐文章
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.. PersonDaoBean 是在应用内部创建及维护的. 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.