一图流
- 注意下同一个线程要使用同一份引用,不要瞎 new
- 及时 remove()
Thread ThreadLocalMap ThreadLocal 关系
Thread
有一个成员变量ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocalMap
是ThreadLocal
的静态内部类ThreadLocalMap
存储的是弱引用类型的ThreadLocal
- key 为
ThreadLocal
对象 , value 为 对应的值public class ThreadLocal {
// other
static class ThreadLocalMap {
// other
static class Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
}
}
- 图示
注意点
ThreadLocalMap
中 对Entry
数组的管理不是类似HashMap
的拉链法- 而是 线性探测法
重要方法
T initialValue()
仅仅被
ThreadLocal#get()
调用,用于 延迟加载protected T initialValue() {
return null;
一般都是要 重写 的,如果不需要初始值,可以不用
T get()
- 自带 延迟加载
- 如果
Thread#currentThread().threadlocals
中是否存在调用get()
的ThreadLocal
对象的元素- 有则返回对应元素的值
- 没有则调用
setInitialValue()
,设置this
进Thread
且返回public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
setInitialValue
- 将 调用
get()
的ThreadLocal
对象的元素存储进当前线程的threadlocals
中private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
// 对应 Thread.currentThread.threadlocals 一开始为 null;
createMap(t, value);
return value;
}
remove()
- 将 调用
get()
的ThreadLocal
对象的元素从当前线程的threadlocals
中删除public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
set(T value)
- 将 调用
get()
的ThreadLocal
对象的元素存储进当前线程的threadlocals
中public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
// 对应 Thread.currentThread.threadlocals 一开始为 null;
createMap(t, value);
}