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);
}
相关推荐
洋不写bug1 分钟前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
白狐_79840 分钟前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
我不会起名字3223 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
不会就选b3 小时前
算法日常・每日刷题--<贪心+大根堆>2
数据结构·算法
事圆则缓4 小时前
Java 常见数据结构与 Android 使用场景
android·java·数据结构
白狐_7984 小时前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
kiracrimson17 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
心抵鹊18 小时前
归并排序之翻转对(hard)
数据结构·算法
白狐_79821 小时前
408 数据结构|红黑树插入:只记两大类
数据结构
Lost of 程序猿1 天前
.NET 线程安全集合与并发数据结构深度实战:从 lock 到无锁
数据结构·安全·.net