线程安全 ---Struts1与Struts2
1.线程安全
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全
2.线程安全的类
Vector 的方法都是同步的。
hashtable 的方法都是同步的。
3.struts1和struts2线程安全问题
Struts1: Action 是单例的模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求.单例的策略限制了Struts1 Action 能做的事情,并且要在开发的时候特别的小心. Action 资源必须是线程安全或者同步的。 但是在用Struts1开发时并没有考虑到线程安全问题,这是因为我们在anction中使用的基本都是局部变量,而"局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享资源,局部变量包括方法的参数变量" 在Struts1中,所有的变量都是定义在action中我们要执行的方法里的(Action中的excute方法或DispachterAction中 指定要执行的方法),我们用于封装客户端请求参数的ActionForm,也是作为一个参数传入的,也属于局部变量,因此也不存在线程安全问题。
Struts2:Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全的问题。因此虽然在Action中定义了很多全局变量,也不存在线程安全问题。 Struts2框架在处理每一个用户请求的时候,都建立一个单独的线程进行处理,值栈ValueStack也是伴随着局部线程而存在 的,在该线程存在的过程中,可以随意访问值栈,这就保证了值栈的安全性。在Struts2中,ActionContext是一个局部线程,这就意味着每个线程中的ActionContext内容都是唯一的,所以开发都不用担心Action的线程安全。