那你讲一下ThreadLocal

啊,ThreadLocal你没听过?

算了,我给你讲一下再走,也不算白跑一趟

1.Thread

提到ThreadLocal,先从Thread类看起,类中一个有ThreadLocalMap成员变量,嗯,隐隐觉得不对劲

2.ThreadLocal

ThreadLocal的set()

set的时候获取当前线程,通过自己为key,值为vaule往里放

这个getMap()你猜是怎么实现的?是不是就是去拿threadlocalmap?

没错就是直接.threadLocals拿thread里面的那个map而已,这也封一个方法吓人呢

Threadlocal的get()

取的时候拿到当前线程以ThreadLocal为key去map里取值保证拿的都是独一的

get set看完了,你可能说,这玩意有啥用,老司机我干开发几年来都没用过。

突然想起以前有人说:学英语出社会就没用了。

有个人回答说:不是英语没用是你还没到用它的地步

可以说不知道ThreadLocal,作为Android开发那么Handler机制还没真正掌握

虽然你知道msg怎么发送,Looper去消息队列拿msg处理这个流程,但是looper和线程是一对一还是多对一?如果是一对一怎么保证线程具有独立的looper?

就是靠这个ThreadLocal

3.Looper与ThreadLocal

不搞空中楼阁,知道ThreadLocal如何get和set后直接结合looper源码实际来加深印象

looper的set和set

looper的存储,创建looper的时候同时放ThreadLocal保证每个线程一个looper,get出来有说明已经存在,直接抛异常

这个get和set的源码就是上面刚刚看过的,是不是一下子很清晰了

但转头一想可能又觉得有点似懂非懂,又是Thread,ThreadLocal又是ThreadLocalMap有点乱,为什么使用ThreadLocal作为key?这个ThreadLocalMap又怎么回事?是个hashmap结构?

生动的例子

别急,我举个栗子

你是一个经常出差住酒店的用户,你是希尔顿酒店的vip,同时也是汉庭酒店的vip,酒店里对于vip用户是有寄存服务的,你想存点私房钱,你去希尔顿的寄存室里刷脸就打开了属于你的寄存柜,然后你放了一根金条。鸡蛋不能放统一篮子的原则,你又去汉庭的寄存室刷脸打开脸你的寄存柜,又放了一捆现金。

当然你不可能去汉庭酒店取到金条,也不可能让别人在你的寄存柜里取东西。

希尔顿酒店,汉庭酒店都是(thread),寄存室(threadlocalmap),你(threadlocal),你刷脸(threadlocal作为key),金条,现金(value)

这样我想你应该理解了

上面还有一个东西没讲,寄存柜(Entry),就是ThreadLocalMap是个啥结构?

4.ThreadLocalMap

一进来就看到这个静态的Entry,再往下翻

一个16的初始容量,一个table数组,再往下

看到构造方法了,初始化16个的Entry数组赋值给table,到这里其实就知道了,map不是那个map,只是一个数组实现的存储结构

ini 复制代码
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);

再看方法的第二行一通计算好像看不懂,但是按照对hashmap的直觉,就是用hash算法算位置i,然后第三行就是放到这个i位置,hashmap处理hash冲突是用链表,这里是用线性探测,找到合适位置放置。 更详细的有兴趣的自行开源码就可以了,起码知道是个什么结构。

总结:

讲了Thread与ThreadLocal关系和set get方法的源码,结合Android的looper的源码看了looper如何使用Threadlocal保证每个thread独立looper的,举了一个生动栗子,看了ThreadLocalMap的数组结构。

谢谢朋友们!

相关推荐
计算机毕设指导612 分钟前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study13 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data16 分钟前
二叉树oj题解析
java·数据结构
牙牙70522 分钟前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
paopaokaka_luck29 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭42 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师43 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
The_Ticker1 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法