【重学Java】(四)Handler与ThreadLocal

12 篇文章 0 订阅

先放结论:很多网上的文章说,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对象。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值