首先我们得从 Thread 类讲起,在 Thread 类中有维护两个 ThreadLocal.ThreadLocalMap 对象(初始为 null,只有在调用 ThreadLocal 类的 set 或 get 时才创建它们):threadLocals 和 inheritableThreadLocals。也就是说每个 Thread 对象都有两个 ThreadLocalMap 对象,ThreadLocalMap 是 ThreadLocal 定制的 HashMap...
publicvoidset(T value) {//获取当前线程Thread t =Thread.currentThread();//获取ThreadLocalMapThreadLocal.ThreadLocalMap map =getMap(t);//如果ThreadLocalMap不是空则直接把当前ThreadLocal作为key存到map中if(map !=null) map.set(this, value);else//如果ThreadLocalMap是空,就初始化mapcreateMap(t, ...
privatevoidset(ThreadLocal<?>key, Object value) { Entry[] tab=table;intlen =tab.length;//根据key的hash值计算其应该设置的下标(具体这个hash值什么时候设置的后面的文章会讲到)inti = key.threadLocalHashCode & (len-1);//该for循环只有在发生了hash碰撞的时候会进入,我把其内部代码提出来下面分析,标记...
publicvoidset(Tvalue){Thread t=Thread.currentThread();ThreadLocalMap map=getMap(t);if(map!=null)map.set(this,value);else//第一次的时候进来这里,因为ThreadLocalMap 还没和Thread 绑定createMap(t,value);}//这个时候开始创建一个新的ThreadLocalMap 赋值给Thread 进行绑定voidcreateMap(Thread t,Tfirs...
1. ThreadLocalMap的基本概念 ThreadLocalMap 是Java 中 ThreadLocal 类的一个内部类,用于存储线程局部变量。每个线程都维护着一个 ThreadLocalMap,这个映射表存储了一组以 ThreadLocal 对象为键,任意对象为值的键值对。这样,每个线程都可以拥有自己独立的变量副本,互不干扰。
1. ThreadLocalMap是ThreadLocal类中的一个内部静态类,它维护了一个以ThreadLocal对象为key,以线程局部变量为value的Map。 2. 每个线程都有自己的ThreadLocalMap实例,用于存储该线程的局部变量。这样可以确保每个线程访问的变量是独立的,不会相互干扰。 二、ThreadLocalMap的使用方法 1. 创建ThreadLocal对象 首先需要...
1、Thread 里面有 ThreadLocalMap 字段。为了给每一个 Thread 都关联一个 ThreadLocalMap。 2、ThreadLocal 里面存在内部类 ThreadLocalMap 这个内部类 ThreadLocal 原理是什么 在 ThreadLocal 类的内部维护一个 ThreadLocalMap 内部类,这个类是 定制化的 HashMap ,因为它的设计思想以及实现与 HashMap 是类似的。...
由执行结果可知,每个线程通过ThreadLocal获取到的String都是自己线程副本的内容,各线程有很好的隔离。注意:ThreadLocal通常都定义为static,ThreadLocal没有存储功能,变量副本的真实存储位置是Thread对象的threadLocals这个ThreadLocal.ThreadLocalMap变量中,可以将ThreadLocal理解为一个工具类,用来保证线程本地变量的存储...
,通过当前线程对象 t 获取线程的 ThreadLocalMap 对象 map ,接着判断 map 是否为 null——为 null 则调用creadMap() 方法传入当前线程对象 t 和当前 set() 方法的入参 value 创建为当前线程创建 ThreadLocalMap 对象并 put value 添加变量;不为 null 则调用 map.set(value) 设置该 ThreadLocal 对象的值。
ThreadLocalMap源码剖析 ThreadLocalMap是ThreadLocal的静态内部类,没有完成Map接口,独立完成了Map的功用,内部的Entry也是独立完成的。 与HashMap类似,初始容量默认是16,初始容量有必要是2的整数幂。经过Entry类的数据table寄存数据。size是寄存的数量,threshold是扩容阈值。