Map源码解析之HashMap
Map源码解析之HashMap红黑树
Map源码解析之HashMap补充:集合、迭代器、compute、merge、replace
Map源码解析之LinkedHashMap
Map源码解析之TreeMap
Map源码解析之HashTable
Map源码解析之ConcurrentHashMap(JDK1.8)(一)
Map源码解析之ConcurrentHashMap(JDK1.8)(二)
Map源码解析之ConcurrentHashMap(JDK1.7)
ThreadLocalMap虽然并没有实现java.util.Map接口,但其也是由键值对组成的map结构,本文将针对ThreadLocalMap进行解析。
一、简介
ThreadLocalMap是ThreadLocal的静态内部类,key值为线程本地变量,value值为线程本地变量的值。
ThreadLocalMap的数据结构是一个用数组表示的环,数组长度必须是2的次幂,同样通过hash方式确定节点在数组中的下标(hash值是ThreadLocal的递增变量,而不是hashcode值),对于hash冲突的情况,采用线性探测法,直接将元素防止对应下标后面的下一个空闲单元。
ThreadLocalMap的key采用的是弱引用WeakReference,因此在使用过程中还需要注意及时清理key已经被gc回收的节点,及时释放无效空间。
二、属性
/**
* The initial capacity -- MUST be a power of two.
*/
//初始容量,2的次幂
private static final int INITIAL_CAPACITY = 16;
/**
* The table, resized as necessary.
* table.length MUST always be a power of two.
*/
//节点数组
private Entry[] table;
/**
* The number of entries in the table.
*/
//节点数量
private int size = 0;
/**
* The next size value at which to resize.
*/
//阈值,容量的2/3
private int threshold; // Default to 0
三、Entry类
Entry是ThreadLocalMap的内部类,用来表示其中的节点,继承了弱引用WeadReference<ThreadLocalMap>类。
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
四、构造方法
1. ThreadLocalMap#ThreadLocalMap(ThreadLocal<?>, Object)
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
根据第一个节点的key和value初始化map。
初始化数组,确定节点再数组的下标,初始化table[i],设置size和threshold。
进行散列的hash值是ThreadLocal的