什么是ThreadLocal?首先要说明的一点是ThreadLocal并非一个Thread,而是Thread的局部变量。在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类能够很简洁地编写出优美的多线程程序。当使用ThreadLocal维护变量时,ThreadLocal为每一个使用该变量的线程提供独立的变量副本,因此每个线程均可以独立地改变本身的副本,而不会影响其它线程所对应的副本。下面咱们就来看看ThreadLocal的初步内容:java
多线程安全性解决方案安全
①进行同步控制synchronized 效率下降 并发变同步(串行)多线程
②使用ThreadLocal 本地线程 每一个线程一个变量副本(各不相干)并发
两种线程安全方案的差别工具
归纳起来讲,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而 ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不一样的线程排队 访问,然后者为每个线程都提供了一份变量,所以能够同时访问而互不影响。线程
扩展问题内存
咱们知道在通常状况下,只有无状态的Bean才能够在多线程环境下共享,在Spring中, 绝大部分Bean均可以声明为singleton做用域。就是由于Spring对一些Bean(如RequestContextHolder、 TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用 ThreadLocal进行处理,让它们也成为线程安全的状态,由于有状态的Bean就能够在多线程中共享了。资源
综上所述:两种解决方案,ThreadLocal占用内存较大,可是速度快,而线程同步相对内存占用小,可是速度慢。若是在内存比较充足的状况,对并发部分的执行效率要求很高的话,那么就是ThreadLocal登场的时候了。通常状况下用同步机制仍是居多的。
作用域