ThreadLocal:
一个线程内部的数据存储类,可以在指定线程中存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据。
先看下以下代码:主要是重写了initialValue方法(请看下面的源码)
@Test
public void test(){
final ThreadLocal<String> threadLocal=new ThreadLocal<String>(){
@Nullable
@Override
protected String initialValue() {
//重写初始化方法。默认返回null
return "abc";
}
};
//abc
System.out.println(threadLocal.get());
//创建一个新线程
Thread thread=new Thread(){
@Override
public void run() {
super.run();
String name=threadLocal.get();
System.out.println(name);
threadLocal.set("cba");
name=threadLocal.get();
System.out.println(name);
}
};
thread.start();
}
get源码:
首先是在获得自己所在的线程,然后getMap获得Thread全局变量(?)threadLocals(为null)。所以执行不了if。直接执setInitialValue方法。也就是我们重写的方法。然后在该线程创建一个ThreadLocalMap对象。
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();
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}