背景
从ThreadLocal到ThreadLocalMap
介绍
ThreadLocalMap 为Thread的成员变量threadLocals的类型
源码
值存放在Entry Table[]中
Entry中,key是ThreadLocal弱引用,value就是ThreadLocal的值对象
Entry数组默认16长度,长度必须为2的倍数
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
/**
* The initial capacity -- MUST be a power of two.
*/
private static final int INITIAL_CAPACITY = 16;
/**
* The table, resized as necessary.
* table.length MUST always be a power of two.
*/
private Entry[] table;
在get,set的时候都会清除线程Map里所有key为null的value
getEntryAfterMiss
expungeStaleEntry
cleanSomeSlots
replaceStaleEntry
问题
- 长度为什么必须为2的倍数
- 为什么使用弱引用?
拓展
- HashMap(集合类)