一图流
- 注意下同一个线程要使用同一份引用,不要瞎 new
- 及时 remove()
Thread ThreadLocalMap ThreadLocal 关系
Thread有一个成员变量ThreadLocal.ThreadLocalMap threadLocals = null;ThreadLocalMap是ThreadLocal的静态内部类ThreadLocalMap存储的是弱引用类型的ThreadLocal- key 为
ThreadLocal对象 , value 为 对应的值public class ThreadLocal {// otherstatic class ThreadLocalMap {// otherstatic 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);}
