Java中的Threadlocal源代码学习
ThreadLocal是什么回过头,想想ThreadLocal实现了什么样的功能。举个例子,当不同的线程都去执行同样一个语句以获得当前线程的Looper时,要怎么实现?或许吧,ThreadLocal就实现了这样一个功能。在Looper中,申明了一个如下的静态变量,说明只有一个。static fina
ThreadLocal是什么
回过头,想想ThreadLocal实现了什么样的功能。举个例子,当不同的线程都去执行同样一个语句以获得当前线程的Looper时,要怎么实现?或许吧,ThreadLocal就实现了这样一个功能。
在Looper中,申明了一个如下的静态变量,说明只有一个。
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
然后在Looper中调用myLooper()时,都执行了
public static @Nullable Looper myLooper() {
return sThreadLocal.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();
}
在每个Thread中,有个ThreadLocal.ThreadLocalMap。获取到当前线程的map之后,又将sThreadLocal自身作为一个Key,去获取到相应的结果。再看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);
}
相同的套路,同样是先获取到当前线程的map,然后用ThreadLocal自身作为Key,存进去。
小结
因此对于ThreadLocal,可以这样理解:它自身就是一个Key,然后可以以这个Key在不同的线程中存储/获取一个值,值得类型就是声明时,尖括号里面的类型。