首先我们得从 Thread 类讲起,在 Thread 类中有维护两个 ThreadLocal.ThreadLocalMap 对象(初始为 null,只有在调用 ThreadLocal 类的 set 或 get 时才创建它们):threadLocals 和 inheritableThreadLocals。也就是说每个 Thread 对象都有两个 ThreadLocalMap 对象,ThreadLocalMap 是 ThreadLocal 定制的 HashMap...
privatevoidset(ThreadLocal<?>key, Object value) { Entry[] tab=table;intlen =tab.length;//根据key的hash值计算其应该设置的下标(具体这个hash值什么时候设置的后面的文章会讲到)inti = key.threadLocalHashCode & (len-1);//该for循环只有在发生了hash碰撞的时候会进入,我把其内部代码提出来下面分析,标记...
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, ...
1、Thread 里面有 ThreadLocalMap 字段。为了给每一个 Thread 都关联一个 ThreadLocalMap。 2、ThreadLocal 里面存在内部类 ThreadLocalMap 这个内部类 ThreadLocal 原理是什么 在 ThreadLocal 类的内部维护一个 ThreadLocalMap 内部类,这个类是 定制化的 HashMap ,因为它的设计思想以及实现与 HashMap 是类似的。...
由执行结果可知,每个线程通过ThreadLocal获取到的String都是自己线程副本的内容,各线程有很好的隔离。注意:ThreadLocal通常都定义为static,ThreadLocal没有存储功能,变量副本的真实存储位置是Thread对象的threadLocals这个ThreadLocal.ThreadLocalMap变量中,可以将ThreadLocal理解为一个工具类,用来保证线程本地变量的存储...
初看ThreadLocal代码时候,感觉到很绕。区区三个类,但他们之间的类关系和设计思路与我们平常写的业务代码是不太一样的。 让我们一起来看看这三个类之间错综复杂的关系吧。 三者关系概览 从上图我们可以发现Thread 中持有一个ThreadLocalMap ,这里你可以简单理解为就是持有一个数组,这个数组是Entry 类型的。 Entry ...
ThreadLocalMap 是在Thread这个类里面的 ThreadLocal set 是将V设置到了自己的ThreadLocalMap容器当中 为什么Entry 要使用弱引用: 若是强引用,即使tl = null, 但是key 的引用依然指向ThreadLocal对象,所以会有内存泄漏,而弱引用则不会 当tl 这个强引用小时,key的指向也被回收,但是key 指向了一个null值,这个thread...
对于ThreadLocal再做一次总结:每个线程中有一个threadLocals属性对应的ThreadLocalMap,线程在执行ThreadLocal对象的set()、get()方法时,会把ThreadLocal对象作为key并利用这个ThreadLocalMap设置值或获取值。再聊聊InheritableThreadLocal 线程中另外一个属性inheritableThreadLocals也是一个ThreadLocalMap,InheritableThread...
2.ThreadLocal.set(): publicvoidset(T value) { Thread t=Thread.currentThread(); ThreadLocalMap map=getMap(t);if(map !=null) map.set(this, value);elsecreateMap(t, value); } ThreadLocalMap getMap(Thread t) {returnt.threadLocals; ...