转:
ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。在1.5以前的版本中,synchronized是自动释放锁。在JDK1.5的版本中,提供了类java.util.concurrent.locks.Lock。它比synchronized更精确和有更高的性能。这时该变量是多个线程共享的,使用这种同步机制需要有较强的多线程基础和编程经验,因为需要知道对变量进行读写的时机,什么时候需要锁定这个对象,又什么时候需要释放该对象的锁等等很多问题。所有这些都是因为多个线程共享了资源造成的。而ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码的时候,就可以把不安全的变量封装进ThreadLocal,当然也可以把该对象的特定于线程的状态封装进ThreadLocal。

解决方案 »

  1.   

    ThreadLocal类好像和同步没关系把,好像里面有个map,当调用get或set方法时,用当前的thread 作key,来取出数据或者存入数据。
      

  2.   

    ThreadLocal 是Java技术提供的内嵌的同一线程内不同对象共享数据的一种方式。你可以把jdk下面的src.zip解开,看看源代码,不是很难理解。关键是什么情况下用,如何用的问题。我告诉你一个例子吧。我们写web应用,你可能会碰到需要一个servlet以及若干个Filter。经过适当的mapping后,相对每个http request,Servlet Engine会开始一个线程并在这个线程里运行这些对象相应的方法。一个请求对应一个线程,servlet响应完后,线程被释放回线程池(线程死掉)。如果你需要这些Filter和Servlet在线程开始到线程结束之间交换一些数据,又不想封装这些数据的对象的生命期更长,那就可以用ThreadLocal来实现。想了解更多的技术,来参加我们的长期的、免费的技术交流活动吧。详情见:
    http://www.tianji.com/Event/DetailEvent?eventId=486896&groupId=
      

  3.   

    《J2EE开发全程实录》提到了ThreadLocal的实战性应用,很好的解决了上下文的问题,这有在线版:http://book.csdn.net/bookfiles/427/