struts2线程安全

struts2线程安全 2012-02-16
21:07:58

分类: 系统运维

问题:
Struts 2
Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Spring的Ioc容器管理的bean默认是单实例的,上一次请求处理的状态信息被保持下来,并影响了下一次的请求,实际上就是Action中的类变量被不同的请求读取,出现错误结果

解决:就是不用单例,
spring中bean的作用域设为prototype,每个请求对应一个实例.

1、Struts1
Struts1是单例模式,也就是所,Web容器(例如:Tomcat)启动的时候,就会实例化一个Action对象,那么所有请求都是用的这个对象。所以当遇到2个请求并发的时候,那么其实他们调用的是同一个类,这个时候当你在Action内部定义属性的时候,就会产生线程同步的问题。
例如:
你在Action定义了一个
int i =
0;
然后在这个Action里面的某一个方法里面对这个i进行操作。当并发的时候就会遇到问题。
所以:我们在用struts1的时候不能在action里面定义属性。要用到只的话只能在方法里面定义。
2、struts2
Struts
2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。所以我们可以在Struts2的Action里面去定义属性。但是Struts2由于
Action和普通的Java类没有任何区别(也就是不用像Struts1里面那样去实现一个Struts的接口,有兴趣的朋友可以自己去了解),所以我们可以用Spring去管理Struts2的Action,这个时候我们就要注意了,因为当我们在spring里面去定义bean的时候,spring默认用的是单例模式。所以在这个时候,你就要修改Spring的配置文件---即修改scope为prototype。
为什么struts1中并没有考虑到线程问题,因为所有的代码都是写在execute的方法中,所有变量都是定义在里面,所以没有线程安全问题。
而现在的struts2就不一样了。struts2的action中就像一个POJO一样,定义了很多的类变量。这就有线程安全问题了。。此时,就使用scope=prototype来指定是个原型模式,而不是单例,这样就解决了线程安全问题。每个线程都是一个新的实例。。

但是,线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在编写容易度和性能上会更好些。
我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下:
1)常量始终是线程安全的,因为只存在读操作。
2)对构造器的访问(new
操作)是线程安全的,因为每次都新建一个实例,不会访问共享的资源。
3)最重要的是:局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量。
struts
user guide里有:
Only Use Local Variables - The most important principle that
aids in thread-safe coding is to use only local variables, not instance
variables , in your Action
class.
译:只使用用局部变量。--编写线程安全的代码最重要的原则就是,在Action类中只使用局部变量,不使用实例变量。

struts2线程安全,布布扣,bubuko.com

时间: 2024-10-13 00:28:19

struts2线程安全的相关文章

实际工作中遇到关于Struts2线程安全的问题解决

今天工作遇到一个难缠的bug,浪费了2个小时终于解决. 问题描述:对资源的管理中用到关键字查询以及分页查询.视图控制器用到struts2,数据存储用spring的data-mongodb来存储数据以及查询数据.但是发现一个问题,在用分页查询时能查询出所有记录,然后用关键字查询获取查询内容后,在用分页查询但是只能获取关键查询的数据,其他数据死活查询不出来.开始我以为是自己前端有逻辑问题,但是我用其他的浏览器操作同样出问题.因此知道问题出在后台代码.开始以为是不是数据有缓存,但是其他模块也这样实现没

struts1和struts2线程安全问题

这是由于Servlet的工作原理产生的.我们先来简单回顾一下Servlet的生命周期“初始化->init->service->destroy->卸载”. 这里大家都知道,我们在web.xml里面定义一个servlet的时候,我们可以给他们设置一个“load-on-startup” 的值,如果 Servlet 的 load-on-startup 配置项大于 0,那么在 Context 容器启动的时候就会被实例化,并且tomcat给每一个servlet加载并且实例化一个对象(注解:也就

servlet/struts1/struts2/spring mvc 的线程安全问题

线程安全的概念: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全. 在Java里,线程安全一般体现在两个方面:  1.多个thread对同一个java

线程安全 ---Struts1与Struts2

1.线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题. 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行

struts2技术要点

1,MVC框架完成的事情 ServLet做哪些事情: 处理用户提交的数据 调用业务方法 处理业务结果 控制视图显示 用户请求映射到一个Java类 MVC框架做的事情 将用户请求映射到一个Java类 获取用户提交的数据 渲染数据(将数据封装到前台显示(request)) 控制视图跳转 注:    ServLet strtus2 默认执行方法 service execute 方法参数 HttpServLetRequest, HttpServletRespones 无 返回值 无 String 方法

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么

java 知识点随记

JAVA 读取配置文件: Properties props= new Properties();//文件在src目录下,编译会被加载到classpath下. Props.load(Test.class.getClassLoader().getResourceAsStream(‘observer.properties’); String temp = Props.getproperty(‘observers’); HTML 非表单标签: b粗体  u 下划线  i 斜体 del 删除效果 a 超链

struts学习总结

关于struts2的框架,他是由struts1和webwork结合而成的.struts2线程是安全的 strut2表面是strut1的升级,实质则是WebWork的升级.strut2 是strut1与WebWork的整合,核心是WebWork. struts2采用的两个基础: 底层和webwork一样使用threadlocal类来提供变量,这个变量只能在一个线程中被访问,实现了一个萝卜一个坑,不会出现因为多个访问修改数据而造成数据错误,但缺点在于,空间消耗很大,不适合用于高并发软件开发! 另外一

Servlet和Struts2的线程安全问题

通常情况下,系统只生成servlet的单一实例之后,为每个用户请求建立新的线程.如果很多请求同时到来,那么多个线程可能会并发的访问同一个servlet对象.servlet是线程不安全的,在多线程访问servlet的时候,有一些限制: 尽量不要有成员变量: 如果有成员变量,这个成员变量也要是无状态的成员变量: 如果非要有成员变量,这个成员变量只能是只读的: struts2本身就是多实例.单线程的,所以可以说本身就是线程安全的. (Action是线程安全的,因为struts2中,action是多例的