首先我们先来看一下ThreadLocal的四个方法
1.void set(T value)
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的本地方法,返回对当前正在执行的线程对象的引用,有兴趣的可以自行了解
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
这里的getMap(t)返回的是ThreadLocalMap类型
这里借用一下大佬的图
ThreadLocal类的作用是为变量在每个线程中的都创建了副本,每个线程可以访问自己内部的副本变量,线程之间互不影响。
接着我们来看ThreadLocalMap
static class ThreadLocalMap{...}
这是ThreadLocal中维护的一个static类,主要作用是
将线程变量和其副本关联(映射)起来,同时隔绝了其他ThreadLocal的访问,至此我们能够发现最上面的set方法 就是设置当前线程的线程局部变量的值。
2.T get()
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()
protected T initialValue() {
return null;
}
这个方法延迟调用,线程第一次调用get()或者set(T value)才执行。