企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
* 主要是通过ThreadLocal 内部的静态内部类 ThreadLocalMap 实现的,在使用ThreadLocal 的时候,是先通过当前线程得到 ThreadLocalMap 对象. * ThreadLocalMap内部是一个 Entry[] 数组存储的,Entry[] 内部存储了是以 ThreadLocal的 threadLocalHashCode 为键,以本地线程变量为值的 K-V值对,ThreadLocal 就是当前线程的访问 ThreadLocalMap 的入口,每一个ThreadLocal 对象都包含了一个独一无二的 threadLocalHashCode 值,使用这个值就可以在线程ThreadLocalMap 的 K-V 值对中找到对应的本地线程变量。 * 这个值对是以弱引用包裹起来的,为了在不需要的时候 让系统进行回收,不过最好还是手动调用 remove 移除。 ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200309153332.png) 后根据 ThreadLocalMap 对象以 ThreadLocal 对象获得 ThreadLocal 对象对应的 value 值。在获取 ThreadLocalMap 对象的时候,是通过当前线程的对象获得的,所以保证了一个线程有一个 ThreadLocalMap 对象,保证了线程隔离,然后再不同的线程中根据不同的 ThreadLocal 对象获取具体对应的值。 [Android的消息机制之ThreadLocal的工作原理](https://blog.csdn.net/singwhatiwanna/article/details/48350919) [参考地址](https://chenjiayang.me/2018/01/26/threadlocal-source-code/) 首先是在 Therad 类中有一个属性 ~~~ /* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null; ~~~ ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190617235233.png) ThreadLocalMap: ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190617235329.png) 这个 Map 的 key 是 ThreadLocal 变量,value 为用户的值。 1. Thread类中有一个成员变量叫做 ThreadLocalMap ,它是一个 Map,虽然叫 map,但是内部确实用数组来实现的,索引为 ThreadLocalHashCode 值。存储的是一个弱引用,弱引用里面是具体的值。 2. 每个线程拥有自己的声明为 ThreadLocalMap 类型的变量,所以这个类的名字叫 'threadLocals',一个线程对应一个 ThreadLocal ,但是和 ThreadLocal 对应的值可以有很多个。 3. 此变量生命周期是由该线程决定的,get或者set方法在第一次执行的时候进行初始化,在线程的`exit()`方法执行的时候,进行销毁。 4. 由ThreadLocal和 ThreadLocalMap 两者结合的工作原理决定了:每个线程独自拥有一个变量,并非共享或者拷贝