set的入口函数
过程:
- 获取当前线程
- 获取当前线程属性ThreadLocalMap
- 判断当前线程属性ThreadLocalMap是否为null
- 如果不为空,则直接设置值
- 如果为空,则创建ThreadLocalMap
创建ThreadLocalMap
调用ThreadLocalMap的有参构建器
ThreadLocalMap的有参构建器
- 创建table,也就是给Entry[]赋值。其中,INITIAL_CAPACITY是16
- 通过hashcode&(INITIAL_CAPACITY-1)按位于
- 给这个table[i]赋值。
- 指定大小为1,但是长度是16
- 设置扩容阈值(为容量的三分之二大小)
扩容阈值源码:
/**
* Set the resize threshold to maintain at worst a 2/3 load factor.
*/
private void setThreshold(int len) {
threshold = len * 2 / 3;
}
Entry创建
- 代码执行红框中的构建函数
- 先调用父类的构建器
- 然后给Object value赋值即可
点击super(k)
创建一个引用给定对象的弱引用
点击super(referent)
因此,我们可以看出entry中的key是弱引用,所以ThreadLocalMap的key是弱引用的。