ThreadLocal 源码

ThreadLocalMap

ThreadLocalMap 是 ThreadLocal 静态内部类,每个 Thread 都会有一个 ThreadLocalMap

java 复制代码
static class ThreadLocalMap {
    // 哈希表存储数组
    private Entry[] table;
    // 数组初始容量 16
    private static final int INITIAL_CAPACITY = 16;
    // 元素数量
    private int size = 0;
    // 扩容阈值:容量2/3
    private int threshold;

    // Entry:弱引用包裹ThreadLocal
    static class Entry extends WeakReference<ThreadLocal<?>> {
        Object value;
        Entry(ThreadLocal<?> k, Object v) {
            super(k); // key弱引用
            value = v;
        }
    }
}

构造方法

java 复制代码
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
    table = new Entry[INITIAL_CAPACITY];
    // 计算hash下标:threadLocalHashCode & (len-1)
    int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
    table[i] = new Entry(firstKey, firstValue);
    size = 1;
    setThreshold(INITIAL_CAPACITY);
}

get

java 复制代码
public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            T result = (T)e.value;
            return result;
        }
    }
    // map为空 / entry为空,返回初始值
    return setInitialValue();
}

getEntry

java 复制代码
private Entry getEntry(ThreadLocal<?> key) {
    int i = key.threadLocalHashCode & (table.length - 1);
    Entry e = table[i];
    // 直接命中,返回
    if (e != null && e.get() == key)
        return e;
    else
        // 冲突/过期key,线性探测查找
        return getEntryAfterMiss(key, i, e);
}

setInitialValue

java 复制代码
private T setInitialValue() {
    // 子类重写initialValue提供默认值,默认null
    T value = initialValue();
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
    	// 调用 ThreadLocalMap 的构造方法,创建 map
        createMap(t, value);
    return value;
}

createMap

java 复制代码
void createMap(Thread t, T firstValue) {
    // new ThreadLocalMap,第一个Entry key=this(当前tl对象)
    t.threadLocals = new ThreadLocalMap(this, firstValue);
}
相关推荐
老师我太想进步了202611 小时前
【数据结构-3】算法美学之降复杂度
数据结构·算法
w_zero_one1 天前
算法--构造
java·数据结构·算法
lisw051 天前
互联网上的数据结构可视化!
数据结构·信息可视化
老师我太想进步了20261 天前
【数据结构-1】例解算法复杂度
数据结构·算法
YSL0701241 天前
一文通关-----排序
数据结构·算法
夜不会漫长2 天前
C++:红黑树
数据结构·算法
冻柠檬飞冰走茶2 天前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c2 天前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶2 天前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
PaperAccept2 天前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算