ThreadLocal用于解决单个线程内的数据共享问题,应用场景一般为单线程子系统(线程封闭的一种实现方案)
ThreadLocal的实现原理大致是:
Thread类中存在一个ThreadLocalMap成员变量(顾名思义,一个Map,嗯),每次调用ThreadLocal的set、get方法时其实是在间接存取ThreadLocalMap中的数据,源码:
public void set(T paramT)
{
Thread localThread = Thread.currentThread();
ThreadLocalMap localThreadLocalMap = getMap(localThread);
if (localThreadLocalMap != null) {
localThreadLocalMap.set(this, paramT);
} else {
createMap(localThread, paramT);
}
}
涉及到的getMap方法
ThreadLocalMap getMap(Thread paramThread)
{
return paramThread.threadLocals;
}
值得注意的是,访问权限为默认。同样在Thread中实现的静态ThreadLocalMap类也是默认的访问权限,所以他们仅限包内引用,也决定了ThreadLocal的地位,承担代理角色,使多线程环境透明化。
很重要的get()方法
public T get()
{
Thread localThread = Thread.currentThread();
ThreadLocalMap localThreadLocalMap = getMap(localThread);
if (localThreadLocalMap != null)
{
ThreadLocal.ThreadLocalMap.Entry localEntry = localThreadLocalMap.getEntry(this);
if (localEntry != null) {
return localEntry.value;
}
}
return setInitialValue();
}
以当前ThreadLocal对象作为key,获得当前Thread map中存储的值。