ThreadLocal学习(三)
上一篇我们说了ThreadLocal的源码,那么肯定有人发出疑问:ThreadLocalMap是什么东西,那么这次就详细说一下ThreadLocalMap。
- 基本结构
ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map功能,内部的Entry也是独立实现
- 成员变量
/**
* 初始变量 -- 必须是2的整次幂
*/
private static final int INITIAL_CAPACITY = 16;
/**
* 存放数据的table,Entry类的定义在下面分析
* 同样,数组长度必须是2的整次幂
*/
private Entry[] table;
/**
* 数组里面entrys的个数,可以用于判断table当前使用量是有超过阈值
*/
private int size = 0;
/**
* 进行扩容的阈值,表使用量大于它的时候进行扩容
*/
private int threshold;
- 存储结构
/**
* Entry继承WeakReference,并且用ThreadLocal作为key
* 如果key为null(entry.get() == null),意味着key不再被引用
* 因此这时候entry也可以从table中删除
*/
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
在ThreadLocalMap中,也是用Entry来保存K-V结构数据的。不过Entry中的key只能是ThreadLocal对象,这点在构造方法中已经限定死了。
另外,Entry继承WeakReference,也就是key(ThreadLocal)是弱引用,目的是将ThreadLocal对象的生命周期和线程生命周期解绑。
以上就是ThreadLocalMap的全部知识了!