【重学Java】(四)Handler与ThreadLocal
先放结论:很多网上的文章说,threadlocal是以当前线程作为key的,这个说法是错误的。正确的说法是:threadlocal用自己做key,存到threadlocalmap中,因为一个Thread只有一个threadlocalmap,这个map中存储了当前线程所有的threadlocal对象。
由一道面试题引申:Handler中如何保证它的Looper是唯一的? 答案:ThreadLocal
我们知道,Looper循环是从Looper.prepare开始的:
可以看到这里sThreadLocal直接set值,我们到ThreadLocal中看下set做了什么
这里获取了当前线程,并且从Thread中获取了ThreadLocalMap(如果没有,那就直接创建),这样就保证了一个线程中只有一个ThreadMap。那么,map.set(this,value)又做了什么呢?
set方法中,通过threadlocal自己作为key对map长度取余得到插入位置,通过开放寻址法,找到对应的插入位置,如果发现之前插入过了,则更新这个值。
至于get方法,就更简单了
直接去threadlocalmap里面去找,如果map没有初始化就触发初始化。
总结一下:很多网上的文章说,threadlocal是以当前线程作为key的,这个说法是错误的。正确的说法是:threadlocal用自己做key,存到threadlocalmap中,因为一个Thread只有一个threadlocalmap,这个map中存储了当前线程所有的threadlocal对象。