Thread、ThreadLocal及ThreadLocalMap三者之间的关系
源码分析
get()
public T get() {
//获取当前线程
Thread t = Thread.currentThread();
//拿到当前线程的ThreadLoclMap
ThreadLocalMap map = getMap(t);
//如果不为空,说明之前创建过ThreadLocalMap
if (map != null) {
//获取Entry然后获取value返回
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//没创建过就创建ThreadLocalMap
return setInitialValue();
}
getMap()
ThreadLocalMap getMap(Thread t) {
//获取当前线程的ThreadLocalMap对象threadLocals
return t.threadLocals;
}
ThreadLocal.ThreadLocalMap threadLocals = null;
set()
public void set(T value) {
//获取当前线程
Thread t = Thread.currentThread();
//获取当前线程ThreadLoclMap对象
ThreadLocalMap map = getMap(t);
//map不为空就加进去value
if (map != null) {
map.set(this, value);
//map为空就创建一个map然后加进去
} else {
createMap(t, value);
}
}
ThreadLocalMap 类就是 Thread.threadLocals
static class ThreadLocalMap {
static class Entry extends WeakReference<ThreadLocal<?>> {
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
//ThreadLocal:value
private Entry[] table;
}
ThreadLocalMap 既然类似于 Map,所以就和 HashMap 一样,也会有包括 set、get、rehash、resize 等一系列标准操作。但是,虽然思路和 HashMap 是类似的,但是具体实现会有一些不同
其中一个不同点:
遇到哈希冲突TLM线性探测法HM用拉链法