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);
}
相关推荐
wuyk55515 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
郝学胜-神的一滴15 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
疯狂打码的少年16 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
wabs66616 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
凉茶钱17 小时前
【数据结构】堆的应用
c语言·数据结构
间歇性努力持续性发呆的野生快乐选手18 小时前
栈的性质(进栈,出栈,访问)
数据结构·c++
m0_5474866618 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光18 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
我变成萤火虫20 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
白狐_79821 小时前
408数据结构第7章:B树①——基础概念与结构
数据结构·b树