ThreadLocal:每个线程可以保存自己的变量,多个线程互不影响,副本,线程独享
set:以当前线程为Key 保存在ThreadLocalMap
public void set(T value) {
//获取到当前执行这段代码的Thread对象 Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
public static native Thread currentThread();
Thread类中有一个ThreadLocalMap threadLocals。ThreadLocalMap是一个类似HashMap的存储结构,那么它的key和value分别是什么呢?
//Thread类 /* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null;
如下,key是一个ThreadLocal对象,value是我们要存储的变量副本
//key是一个ThreadLocal对象,value是我们要存储的变量副本 static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }
至此,一切都明了了。
ThreadLocal对象通过Thread.currentThread()获取当前Thread对象
当前Thread获取对象内部持有的ThreadLocalMap容器
从ThreadLocalMap容器中用ThreadLocal对象作为key,操作当前Thread中的变量副本。
调用链如下:
原文:https://www.cnblogs.com/fanBlog/p/11858880.html