分析一波ThreadLocal
废话不多说,先上测试代码。如下:
public class ThreadLocalTest {
public static void main(String[] args) {
ThreadLocal<String> stringThreadLocal = new ThreadLocal<String>();
stringThreadLocal.set("hello world");
System.out.println(stringThreadLocal.get());
}
}
接下来让我们进入set方法看看做了什么
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
分析下上述代码
1.Thread t = Thread.currentThread(); 获取当前线程对象
2.ThreadLocalMap map = getMap(t);根据当前的线程对象获取对应的ThreadLocalMap
3.判断map是否为空。不为空则以ThreadLocal为key,"hello world"为值设置到map中。
4.map为空,创建ThreadLocalMap 并且设置key和value。
大家会问set方法中getMap方法做了啥?createMap方法做了啥?
接下来分析getMap和createMap这两个方法
getMap源码如下:
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
1.方法直接返回线程对象中的threadLocals成员变量。
2.转到Thread类中查看下threadLocals这个成员变量 ThreadLocal.ThreadLocalMap threadLocals = null; 此 threadLocals的类型即是ThreadLocalMap 。
在看createMap这个方法做了什么
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
1.以当前ThreadLocal为key,“hello word”为值创建了ThreadLocalMap 对象。
2.将创建的ThreadLocalMap 赋值给线程的threadLocals成员变量
ThreadLocal set方法的源码已经全部分析完。
接下来分析get方法源码。