threadlocal是线程局部变量,每一个线程独有,是每个线程在本地工作内存中的对主内存中的数据的一个副本拷贝,这样就可以使得多线程并发访问主内存中这个数据在本地内存中的副本。
每个Thread通过一个threadLocalMap来维护属于这个thread的threadLocal变量表(因为一个线程可能有多个threadlocal变量),它使用threadlocal作为key,变量作为value。
threadLocal常用于数据库连接,session管理等。
InheritableThreadLocal
能解决父子线程传递Threadlcoal值的问题。
- 在创建InheritableThreadLocal对象的时候赋值给线程的t.inheritableThreadLocals变量
- 在创建新线程的时候会check父线程中t.inheritableThreadLocals变量是否为null,如果不为null则
copy
一份ThradLocalMap到子线程的t.inheritableThreadLocals成员变量中去 - 因为复写了getMap(Thread)和CreateMap()方法,所以get值得时候,就可以在getMap(t)的时候就会从t.inheritableThreadLocals中拿到map对象,从而实现了可以拿到父线程ThreadLocal中的值
//threadLocal的set方法
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}