ThreadLocal模式很常用,主要是解决不同层次数据共享问题。
那么,在看struts2的源码的时候,发现struts2中应用了ThreadLocal模式,所以在此进行一下心得。
说道这里就不得不提一下,线程安全问题。大家都知道对于同一个serlet对象的多个请求,servlet的service方法在一个多线程环境下是不安全的,也就是我们所说的单例。
那么为了解决这个问题,Struts2采用了ThreadLocal模式来维护变量。
我们来看一下Thread。java的源码:
public class Thread implements Runnable {
ThreadLocal.ThreadLoaclMap threadLocals=null;
}
这里的ThradLocalMap 跟随者当前的线程而存在。也就是每一个线程独一份。
那么map中存的是当前线程实例对象。
这里提一下ThreadLocal和Synchronized的区别:一个是以空间换取时间,一个是以时间换取空间。ThreadLocal提供了线程安全的共享对象机制,synchronized是通过JVM的锁机制来实现临界区的函数和变量的访问的原子性。
struts2通用引入xwork框架,将整个http请求过程拆分成与web容器相关和与web容器无关的两个执行阶段。而这两个阶段的数据交互就是通过ThreadLocal模式中的线程共享副本安全的进行。
ThreadLocal的优点就是:实现了一个共享环境。所以这个共享环境会跨越多个开发层次而随处存在。
当然,这样多个层次都有依赖,也就是耦合到了一起,从而无法独立测试。