SpringMVC和Struts是线程安全的吗?为什么?

线程不安全的。(其实我觉得回答为:存在线程安全问题 这样比较好点)

原因如下:

第一点,先理解为何线程不安全

struts1的action是单例的,所以存在线程安全问题(struts2是多例的,不存在线程安全问题)
2 spring默认的注入也是单例的,所以也存在线程安全问题

先理解为何会有线程不安全的问题,比如有一个类Person 有个属性是name,线程1修改了这个属性的name,要进行存入
数据库操作的时候,线程2又修改了这个name,这样线程1就存入了一个线程2修改过的数据了。

避免的方法很简单
        struts1如果被spring管理,那么可以设置成scope为protype,这样action就不是单例了,而是为每个线程都创建一个;
        线程安全是可以避免的,就是禁止用可变动的成员变量,如果都是局部变量的话,即使是单例的也不存在任何问题
        里面没什么可变成员变量,说以他们是单例的,但是不会有线程问题

第二点:深入理解

1.首先要理解为什么会产生线程不安全的情况,然后再去考虑一个类是否线程安全
2.其次,线程是否安全,其实和spring、struts没有必然关系


你说struts的action不是线程安全的,那是因为你在action里定义了属性
比如:

Java code
 public class SampleAction extends Action { private String user = null; ... } 
 


     如果有多个用户上来访问这个SampleAction,而且每个用户都要来修改user属性或者说是要对user进行某种操作,那么这就是一种线程不安全的情况,或者说是场景。
     但是,如果你不定义这个user属性,也不定义任何其他属性,那么这个SampleAction就不存在线程不安全的问题。还有种情况,如果你这个属性定义成final的,只是在初始化的时候进行一次赋值,以后所有的操作都只是读取、而不会修改这个属性的值,那么也不会有线程安全的问题。
    再比如,有一个类User,你每次使用这个类的时候都是new出来的,那么这个类一定是线程安全的吗?也不一定。

Java code
 public class User { private static String name = null; public User(String name) { User.name = name; } } 
 

 对于这个User类,即使你每次都是new一个新的,它也不是线程安全的。


总结:servlet、struts1 都是单例的,既然是单例,如果当使用实例变量(static 也就是共享的数据变量)的时候就会有线程安全的问题; struts2必须是线程安全的; 因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了;SpringMVC的controller默认是单例模式(spring 注入的时候可以改配置文件scope="prototype" 非单例)的,所以也会有多线程并发的问题;


解决方法:1)同步共享数据     2)不使用成员实例变量; 3)使用只读数据



文章转自:http://m.blog.csdn.net/blog/panhaixin1988/14209651

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值