Java中的Threadlocal源代码学习

ThreadLocal是什么

回过头,想想ThreadLocal实现了什么样的功能。举个例子,当不同的线程都去执行同样一个语句以获得当前线程的Looper时,要怎么实现?或许吧,ThreadLocal就实现了这样一个功能。

在Looper中,申明了一个如下的静态变量,说明只有一个。

1
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

然后在Looper中调用myLooper()时,都执行了

1
2
3
public static @Nullable Looper myLooper() {
return sThreadLocal.get();
}

顺手打开,看到了这个。

1
2
3
4
5
6
7
8
9
10
11
12
13
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()

1
2
3
4
5
6
7
8
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在不同的线程中存储/获取一个值,值得类型就是声明时,尖括号里面的类型。

Java中的Threadlocal源代码学习

https://eucham.me/2017/12/18/72e47e7db685.html

作者

遇寻

发布于

2017-12-18

更新于

2022-04-21

许可协议

评论