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);
}
相关推荐
m0_547486663 天前
《数据结构教程》全套 PPT课件2026
数据结构
tryxr3 天前
矩阵的几种基础变换
java·数据结构·算法·矩阵
mmmmath_33 天前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
All for pursuit.3 天前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
All for pursuit.3 天前
【栈-5】84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
渡我白衣3 天前
HttpRequest与HttpResponse的实现
服务器·数据结构·c++·人工智能·tcp/ip·机器学习·caffe
晴天的雨.9924 天前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
淡海水4 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
Logic1014 天前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
2401_839080544 天前
C++常见八股
数据结构·c++·算法