初谈struts1,struts2以及spring mvc线程安全

时间:2022-12-11 07:57:06

首先来看,struts1与struts2,在《struts2权威指南》中有这么一段:struts1 action是单例模式并且必须是线程安全的,因为仅有action的一个实例来处理所有的请求。而strut2 action对面为每一个请求产生一个实例,因为没有线程安全问题。

线程安全,指的是在多线程环境下,一个类在执行某个方法时,对类的内部实例变量的访问安全与否。在struts1中,多个线程并发访问action ,如果当前action中没有定义成员变量或者其他共享数据,那我们是否能够说这个action不是线程安全?其实不然,struts1中的线程不安全是由于多个线程并发访问,导致公共数据对象的改变从而获取到不正确的结果,比如:有一个action为A,有两个线程a1,a2,在action中定义了一个成员变量str = "abc",线程a1读取到str时将其值改为了abd,那么a2线程读取到的值为a1更改后的值,这样就造成了线程不安全。

struts2会为每一个请求单独创建一个实例,其内部实际是使用了ThreadLoacl这个对象,将前端来了每个请求生成一个单独的本地线程,各个线程之间互不影响,从而使struts2为线程安全的。

而spring mvc的action线程安全与否可以通过配置文件指定,在配置实体时,可以指定当前实体为单例还是原型,默认为单例,可以通过scope="prototype"来指定为原型,可能大家有疑问,为什么在spring mvc中指定了为单例,而dao层共用一个成员变量jdbctemplate,而不会出现线程安全的问题,其实spring内部为jdbctemplate这个模板类实现了线程安全,就是使用了ThreadLocal这个Java类来实现。


最后:以上是自己的理解,理解有错误的地方,请大家指正,谢谢!