上节讲过了ThreadLocal的源码,这一节我们来看下FastThreadLocal。这个我觉得要比ThreadLocal要简单,因为缺少了对于Entry的清理和整理工作,所以ThreadLocal的效率更高。
跟ThreadLocal一样,我们也先给一个结构图:
大家看这个图跟ThreadLocal有哪些区别,首先是用一个Object数组来替代了Entry数组,不再是key键值对的形式。 另外Object[0]存储一个Set<FastThreadLocal<?>>集合。
OK,看完这个,源码就很好理解了,我们还是先看下 InternalThreadLocalMap 构造函数
1
private InternalThreadLocalMap() {
2
super(newIndexedVariableTable());
3 }
4
5
private static Object[] newIndexedVariableTable() {
6
Object[] array = new Object[32]; //初始化 32 长度的Object数组
7
Arrays.fill(array, UNSET); // 将每个元素初始化成UNSET 这里的UNSET 可以理解为占位符, 因为null会被认为成有效值
8
return array;
9
}
10 UnpaddedInternalThreadLocalMap(Object[] indexedVariables) {
11
this.indexedVariables = indexedVariables;
// 将创建的array赋给 Object[] indexedVariables;
12 }