ThreadLocal
先来看看ThreadLocal的注释:
This class provides** thread-local variables**. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocalinstances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).
翻译过来就是:ThreadLocal提供了线程级的变量,这个变量和其他的使用set、get访问的变量不一样,ThreadLocal针对每个线程会为该变量维护经过单独初始化的副本。ThreadLocal实例希望定义为private static。
从注释可以看出ThreadLocal解决的问题是:
- 单线程的变量共享
单线程变量共享
如果是变量共享为什么不用一个全局变量就好呢?主要是因为ThreadLocal为每个线程维护经过单独初始化的变量副本,但是普通的变量访问到的就是同一个。
上面的注释也说了,ThreadLocal会为每个线程维护经过单独初始化的变量副本,每个线程访问的都是自己的副本,所以各个线程之间不会相互影响,达到隔离的作用
线程同步解决的是多线程访问共享资源的问题,但是ThreadLocal本身并不是用来多线程之间共享的,只是用来单线程共享的,所以ThreadLocal和线程同步根本不是一回事儿
实现原理
-
每个Thread都有一个ThreadLocal.ThreadLocalMap,因为Thread类里面有一个该类的对象,用来存放该线程中所有的ThreadLocal类型的变量
-
ThreadLocalMap里面有一个Entry(继承自WeakReference,一个对象保存一个键值对)数组,根据key(这里就是ThreadLocal变量本身)的哈希值将value(这里就是需要保存的数据)
