struts1单例线程不安全struts2多例线程安全

来源:互联网 发布:敲诈淘宝卖家减肥药 编辑:程序博客网 时间:2024/06/05 12:00
转载:http://zhidao.baidu.com/link?url=hM6wMRIOGs7nRkrBSKVjqp6wMNzBd7B7gfnthPbarN1YXgtulKcx9Oqej2VYW-HTM7HpWbpoSnwnNI-Mo1Rb0a
struts1.1的每个action其实只对应一个实例(单例),而action本身又不带属性,如果你给其action加入了属性的话,那么,所有的请求都调用这个action,那么就共享这个数据了,但是,你加入的属性本身是没有进行线程安全的处理的(即加入synchronized等,因此是不安全的)。struts1.1本身是采用单例来进行处理的,而且不考虑action有成员变量的问题,因此,它本身也就不用考虑线程安全的问题(毕竟考虑线程安全会增加系统开销的),但是你可以自己实现线程安全。
转载:http://zhidao.baidu.com/link?url=gw82P0GaQ_vWjFkPl0DnwBYNSD1h-vcPRfyvF29DLdfHNy-uRcDZinezGOgenzlDQmrmLHk8ECb8r4tepyPOvK
struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结果不一样.举个例子:有一块布长度300cm,能做一件上衣(用掉100cm)和一件裤子(用掉200cm);甲和乙同时访问得到的长度都是300cm,甲想做上衣和裤子,他先截取100cm去做上衣,等上衣做完再去做裤子,而乙这时正好也拿100cm去做上衣,那好,等甲做完上衣再做裤子的时候发现剩下的布(100cm)已经不够做裤子了.....这就是影响系统的性能,解决的办法就是给甲和乙一人一块300cm的布,就不会出现布被别人偷用的事情,也是就单实例和多实例的区别如果设置成单例,那么多个线程会共享一个ActionContext和ValueStack,这样并发访问的时候就会出现问题了struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。所以Struts2的Action是多例模式的。问题出现了,可以让struts2的action变成单例模式么?我在使用spring来生成action的时候,发现生成的action居然全是单例的。这不是让我的程序默认就跑出bug来么?上个用户提交的信息,如果下个用户没填,居然跑到上个用户输入的信息去了。背景:1) Struts2会对每一个请求,产生一个Action的实例来处理.2) Spring的Ioc容器管理的bean默认是单实例的.首先从数据安全性的问题上考虑,我们的Action应该保证是多例的,这样才不会出现数据问题。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一个来提高性能,这样的话,就可以使用单例模式。不过幸好,Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。如果用单例,就在spring的action bean配置的时候设置scope="prototype".好吧,问题到此结束。

0 0