首先咱们先来看一下ThreadLocal的四个方法 html
1.void set(T value)this
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
从上面能够看出set方法中有一个 T value参数,Thread.currentThread()是一个native的本地方法,返回对当前正在执行的线程对象的引用,有兴趣的能够自行了解spa
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
这里的getMap(t)返回的是ThreadLocalMap类型
这里借用一下大佬的图
ThreadLocal类的做用是为变量在每一个线程中的都建立了副本,每一个线程能够访问本身内部的副本变量,线程之间互不影响。
接着咱们来看ThreadLocalMap线程
static class ThreadLocalMap{...}
这是ThreadLocal中维护的一个static类,主要做用是
将线程变量和其副本关联(映射)起来,同时隔绝了其余ThreadLocal的访问,至此咱们可以发现最上面的set方法 就是设置当前线程的线程局部变量的值。code
2.T get()htm
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); }
返回线程所对应的线程局部变量的值
3.public void remove()对象
public void remove() { ThreadLocalMap m = getMap(Thread.currentThread()); if (m != null) m.remove(this); }
为了减小内存的使用,将当前线程局部变量进行删除,线程结束后会自动被垃圾回收。
4.protected T initialValue()blog
protected T initialValue() { return null; }
这个方法延迟调用,线程第一次调用get()或者set(T value)才执行。内存