问个问题,
假设SSH中的action是多例的,假如类中Spring装配了别的类,但是装配的类是单例的,
而且装配的类里带有字段的,这样的action是线程安全吗?详细解答一下,谢谢各位
Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在。
对于Action来说,单例就容易出问题。如果客户端每次提交的参数都是一样的,后面提交的值把前面提交的值覆盖了,那问题还不是很大。但是如果存在可选参数的情况,比如上次提交的是参数1,下次提交的是参数2,但是由于是单例,此时参数1的值不是null,仍然是上次提交的那个值。这样就很容易出问题。
解决的办法就是把Action设置成多例的,每次请求都会生成一个Action的实例,这样多次提交的参数值就不会相互影响了。处理结束以后,Action的实例会被自动回收。和单例相比,多例可能会占用更多的内存,但是不会出bug。
把Bean设置成单例的方法:
把Bean设置成多例的方法:
这个要分情况的, 首先你要知道什么情况下会出现线程安全问题, 当多个线程需要共享状态时才会出现安全问题。
(所谓状态就类似对象里可以保存值的字段),你说的这种情况就是多个线程使用同一个对象,如果这个单例对象的字段只读实际上是不可变的
那就是线程安全的,但如果可变却没有用锁来保证操作原子性和一致性,那就是线程不安全的。
有很大机率是不安全的,关键是不同的线程会否争用一个带状态的对象并有可能改变其状态。如是,则不安全,如果是threadlocal型变量,则可以。