ThreadLocal
1. Looper的获取
Looper的构造方法私有,只能通过静态方法获取。
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
public static @Nullable Looper myLooper() {
return sThreadLocal.get();
}
注意sThreadLocal,他在Looper.java类中是static final修饰,表示不变且唯一。
2. 通过ThreadLocal来get
public T get() {
Thread t = Thread.currentThread(); // 获取当前线程
ThreadLocalMap map = getMap(t); // 获取当前线程对应的map
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this); // 通过this(ThreadLocal)拿到map中的entry
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value; // 拿到entry中的value,即Looper
return result;
}
}
return setInitialValue();
}
说明一下,ThreadLocalMap是ThreadLocal的内部类,里面维护一个Entry数组,每个Entry是一个key、value的形式,key是ThreadLocal,value是Looper。
3. 论证
一个线程对应一个map ----->
map中以key、value形式保存数据 ----->
key是ThreadLocal本身 ---->
Looper的获取是通过静态方法获取 ---->
而Looper中的ThreadLocal唯一且不变 ---->
所以Looper唯一。
最简单的话说就是在同一个线程内,map唯一,key唯一,value肯定唯一。
网友评论