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);
}
相关推荐
不如语冰1 小时前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python
Angle.寻梦1 小时前
数据结构--链表
数据结构·链表
ykdcdc2 小时前
DC-DC隔离和非隔离怎么选?工控/监控/医疗分别用哪种
数据结构·汽车·推荐算法
Angle.寻梦2 小时前
数据结构--堆
数据结构
雨落在了我的手上6 小时前
Java数据结构(六):链表的介绍
java·开发语言·数据结构
Angle.寻梦7 小时前
数据结构--栈与队列
数据结构
热爱前端的小张7 小时前
第六章 图
数据结构
hold?fish:palm8 小时前
11 滑动窗口最大值
数据结构·算法
xvhao20138 小时前
T750414 【游戏】计算24点 题解
数据结构·c++·算法·游戏
自然常数e9 小时前
顺序表专题
c语言·数据结构·visual studio