• ThreadLocal的一些总结


     1 ThreadLocal.class
     2 /**
     3      * Sets the current thread's copy of this thread-local variable
     4      * to the specified value.  Most subclasses will have no need to
     5      * override this method, relying solely on the {@link #initialValue}
     6      * method to set the values of thread-locals.
     7      *
     8      * @param value the value to be stored in the current thread's copy of
     9      *        this thread-local.
    10      */
    11     public void set(T value) {
    12         Thread t = Thread.currentThread();
    13         //根据线程局部变量ThreadLocal实例来获取与之对应的ThreadLocalMap实例
    14         ThreadLocalMap map = getMap(t);
    15         if (map != null)
    16             //如果ThreadLocalMap 不为null,那么就以ThreadLocal为key,以value为值,进行绑定
    17             map.set(this, value);
    18         else
    19             /**
    20               *如果根据当前的线程局部变量没有获取到与之绑定的ThreadLocal.ThreadLocalMap实例,
    21               *那么就创建一个 ThreadLocal.ThreadLocalMap实例 
    22               *且以当前的线程为 key,传入的绑定值 为 value
    23               *
    24             */
    25             createMap(t, value);
    26     }
    27 
    28 
    29 
    30 ThreadLocal.class
    31 
    32 // 在ThreadLocal.java的 224行
    33 /**
    34      * Create the map associated with a ThreadLocal. Overridden in
    35      * InheritableThreadLocal.
    36      *
    37      * @param t the current thread
    38      * @param firstValue value for the initial entry of the map
    39      * @param map the map to store.
    40      */
    41     void createMap(Thread t, T firstValue) {
    42         //这一段代码就把当前线程与 ThreadLocal(下面一行代码里的this就是 ThreadLocal)以及要绑定的值 关联了起来 
    43         t.threadLocals = new ThreadLocalMap(this, firstValue);
    44     }
    45 
    46 
    47 Thread.class的180行
    48 
    49 /* ThreadLocal values pertaining to this thread. This map is maintained
    50      * by the ThreadLocal class. */
    51     ThreadLocal.ThreadLocalMap threadLocals = null;
    52 /*
    53 *通过 Thread类的180行的这行代码我们可以知道,每个线程实例都有一个
    54 * 类型为 ThreadLocal.ThreadLocalMap 的threadLocals属性,
    55 * 这个属性的一个很重要的作用就是 接收 在ThreadLocal.java的224行的
    56 * 方法 createMap(Thread t,T firstValue)里 new的TheadLocalMap变量
    57 */
    58 ThrealLocal.ThreadLocalMap.class
    59 
    60     /**
    61          * Construct a new map initially containing (firstKey, firstValue).
    62          * ThreadLocalMaps are constructed lazily, so we only create
    63          * one when we have at least one entry to put in it.
    64          *  这里是 ThrealLocal.ThreadLocalMap 构造器,
    65          */
    66         ThreadLocalMap(ThreadLocal firstKey, Object firstValue) {
    67             table = new Entry[INITIAL_CAPACITY];
    68             int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
    69             table[i] = new Entry(firstKey, firstValue);
    70             size = 1;
    71             setThreshold(INITIAL_CAPACITY);
    72         }
    73 
    74 
    75 
    76 
    77 
    78 ThreadLocal.class
    79     /**
    80      * Returns the value in the current thread's copy of this
    81      * thread-local variable.  If the variable has no value for the
    82      * current thread, it is first initialized to the value returned
    83      * by an invocation of the {@link #initialValue} method.
    84      *
    85      * @return the current thread's value of this thread-local
    86      */
    87     public T get() {
    88         Thread t = Thread.currentThread();
    89         ThreadLocalMap map = getMap(t);
    90         if (map != null) {
    91             ThreadLocalMap.Entry e = map.getEntry(this);
    92             if (e != null)
    93                 return (T)e.value;
    94         }
    95         return setInitialValue();
    96     }

      

  • 相关阅读:
    Python变量、标识符
    PyCharm中设置作者信息
    去中心化
    复杂逻辑---取数
    行政机构处理
    2020.11案例分析
    中间表
    软考--项目管理名词
    软考--近6次上午考点分析
    软考--学习方法、做题方法
  • 原文地址:https://www.cnblogs.com/Sunnor/p/6689513.html
Copyright © 2020-2023  润新知