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     }

 

  

 

posted @ 2017-04-10 16:07  Sunor  阅读(201)  评论(0编辑  收藏  举报