一开始看了一篇文章,发现确实是写错了。
ThreadLocal的get方法
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }他是先获取当前的线程,再以当前线程为键,从map中取得ThreadLocalMap,又一个map!再以当前的ThreadLocal为键,获取值。所以我们每个线程都维护着一个map,所以这个map实际上就是每个线程各自存放的各个变量的地方。
举个例子来梳理下流程
Looper的源码
比如说你在一个线程中调用了mLooper.prepare()
private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); }这个sThreadLocal是线程类中维护的ThreadLocal
Looper looper = new Looper();
乖乖!为什么要绕这么大一个弯子!优点就是保证了这个变量的线程安全啊!仔细回想下,我们是通过我们的线程去取的。所以说每个线程都会维护一个独一无二的Looper。就算有100万个线程同时操纵Looper类的这个变量,也不会有任何问题啊!