ThreadLocal

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