首页 > 代码库 > Struts2 的dispatcher使用了ThreadLocal模式

Struts2 的dispatcher使用了ThreadLocal模式

不错的解释ThreadLocal链接:http://www.kaifajie.cn/spring/9255.html 
当Web容器收到一个Http请求时,Web容器中的一个主调度线程会从事先定义好的线程池中分配一个当前工作线程,将请求分配给当前的工作线程,由该线程来执行对应的Servlet对象中的service方法。如果这个工作线程正在执行的时候,Web容器收到另外一个请求,主调度线程会同样从线程池中选择另一个工作线程来服务新的请求。Web容器本身并不关心这个新的请求是否访问的是同一个Servlet实例。因此,我们可以得出一个结论:对于同一个Servlet对象的多个请求,Servlet的service方法将在一个多线程的环境中并发执行
Web容器默认采用单实例(单Servlet实例)多线程的方式来处理Http请求。所以这样servlet并不是线程安全的
ThreadLocal模式,严格意义上来说并不能称之为一种设计模式,因为它只是一个用来解决多线程程序中数据共享问题 的一个解决方案。尽管如此,ThreadLocal模式却贯穿了整个Struts2和XWork框架,成为Struts2框架进行“解耦”设计的核心依赖 技术 
1.ThreadLocal会为每一个线程维护一个和该线程绑定的实例变量的副本
2.因为每一个线程都拥有自己独立的实例变量副本,而不会和其它线程的副本冲突
session,request都存放在每一个ThreadLocal副本中 ThreadLocal模式与synchronized关键字都是用于处理多线程并发访问变量的问题。只是两者处理问题的角度和思路不同。 
synchronized很少用1)ThreadLocal是一个Java类,通过对当前线程(Thread)中的局部变量的操作来解决不同线程的变量访问的冲突问题。所以,ThreadLocal提供了线程安全的共享对象机制,每个线程(Thread)都拥有其副本。  
2)Java中的synchronized是一个保留字,它依靠JVM的锁机制来实现临界区的函数或者变量在访问中的原子性。在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。此时,被用作“锁机制”的变量是多个线程共享的。 同步机制采用了“以时间换空间”的方式,提供一份变量,让不同的线程排队访问。而ThreadLocal采用了“以空间换时间”的方式,为每一个线程都提供了一份变量的副本,从而实现同时访问而互不影响。