目录
前言
今天在看算法书中的hash表的时候,解决hash冲突那一块提到了这个概念,所以就想着记录一下
一、什么是ThreadLocal?
ThreadLocal是Thread上的局部变量,可以实现线程之间的隔离,线程内部资源之间的共享,是线程私有的
ps:这里对线程私有公有做如下说明
![]()
二、底层源码
因为ThreadLocal是依附于Thread的,那么我们可以在这里首先看看Thread中对于ThreadLocal的定义
ThreadLocalMap threadLocals;
ThreadLocalMap inheritableThreadLocals;
Thread内部维护了一个ThreadLocalMap的属性,那么什么是ThreadLocalMap?再来看看底层源码
ThreadLocalMap是其静态的内部类,并且是缺省的,所以我们外部不能获取这个内部的对象,只可以通过ThreadLocal来操控。并且内部是由Entry构成,每个Entry数组的key是一个弱引用,value则不是。
关于Entry可以查看:
然后我们来看看ThreadLocal的内部方法:
我们发现如果去get的话,没有get到当前线程的map或者map里没有当前ThreadLocal的键的话,就会初始化一个map,并且将ThreadLocal作为key,null作为value初始化进去(和其他的map实现不同,它的get方法如果get不到的话还会set当前的TheadLocal进去,其他的map实现并没有修改map里的东西);如果获取到了当前线程里的map的话,则将key=ThreadLocal的value值取出来
ThreadLocalMap的一些特点
初始容量为16,扩容因子为 2/3,扩容容量翻倍
采用开放寻址法解决冲突
三、 为什么Map的key要设置为弱引用?
软引用、强引用与弱引用
四、 Value怎么释放?
五、ThreadLocal怎么实现隔离的?
ThreadLocal之所以能达到变量的线程隔离,其实就是每个线程都有一个自己的ThreadLocalMap对象来存储同一个threadLocal实例set的值,而取值的时候也是根据同一个threadLocal实例去自己的ThreadLocalMap里面找,自然就互不影响了,从而达到线程隔离的目的!
总结
ThreadLocal属于Thread的私有的!
ThreadLocalMap不存在的情况下会自动创建【使用get方法的时候】