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