2 a a333 A_A333 于 2018.01.19 10:18 提问

SSH线程安全问题(线程) 5C

问个问题,
假设SSH中的action是多例的,假如类中Spring装配了别的类,但是装配的类是单例的,
而且装配的类里带有字段的,这样的action是线程安全吗?详细解答一下,谢谢各位

3个回答

qq_34789851
qq_34789851   2018.01.19 10:58

Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在。

对于Action来说,单例就容易出问题。如果客户端每次提交的参数都是一样的,后面提交的值把前面提交的值覆盖了,那问题还不是很大。但是如果存在可选参数的情况,比如上次提交的是参数1,下次提交的是参数2,但是由于是单例,此时参数1的值不是null,仍然是上次提交的那个值。这样就很容易出问题。

解决的办法就是把Action设置成多例的,每次请求都会生成一个Action的实例,这样多次提交的参数值就不会相互影响了。处理结束以后,Action的实例会被自动回收。和单例相比,多例可能会占用更多的内存,但是不会出bug。

把Bean设置成单例的方法:


把Bean设置成多例的方法:

qq_36612641
qq_36612641   2018.01.19 16:14

这个要分情况的, 首先你要知道什么情况下会出现线程安全问题, 当多个线程需要共享状态时才会出现安全问题。
(所谓状态就类似对象里可以保存值的字段),你说的这种情况就是多个线程使用同一个对象,如果这个单例对象的字段只读实际上是不可变的
那就是线程安全的,但如果可变却没有用锁来保证操作原子性和一致性,那就是线程不安全的。

nextleave
nextleave   2018.01.20 01:51

有很大机率是不安全的,关键是不同的线程会否争用一个带状态的对象并有可能改变其状态。如是,则不安全,如果是threadlocal型变量,则可以。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!