对ThreadLocal的使用,通常是通过其set/get方法开始的。
set方法的源码如下:
public void set(T value) { Thread t = Thread.currentThread(); //获取当前线程对象 ThreadLocalMap map = getMap(t); //从当前线程对象中拿到该线程的ThreadLocalMap对象 if (map != null) map.set(this, value); //将该ThreadLocal对象作为key,value作为值放入ThreadLocalMap中 else createMap(t, value); }
get方法的源码如下:
public T get() { Thread t = Thread.currentThread(); //获取当前线程对象 ThreadLocalMap map = getMap(t); //获取当前线程的ThreadLocalMap对象 if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); //从ThreadLocalMap中以该ThreadLocal对象为key获取其value值 if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); }
通过上述代码可知,ThreadLocal在set值时,是先获取当前操作该ThreadLocal变量的线程对象,然后将该ThreadLocal对象和值以键值对的形式存入当前线程对象的ThreadLocalMap中,这样,每个线程执行这些代码时都会根据自己的情况为该变量赋不同的值并存于当前线程对象内。
在get值时,也是先获取当前操作线程对象,然后从当前线程对象的ThreadLocalMap中获取该ThreadLocal对象对应的值。
因此通过ThreadLocal设置的变量,在每个线程内都有自己的一个副本,因此就是线程私有的。