浅谈Thread、ThreadLocal及ThreadLocalMap

104 阅读1分钟

Thread、ThreadLocal及ThreadLocalMap三者之间的关系

image.png

源码分析

get()

public T get() {
    //获取当前线程
    Thread t = Thread.currentThread();
    //拿到当前线程的ThreadLoclMap
    ThreadLocalMap map = getMap(t);
    //如果不为空,说明之前创建过ThreadLocalMap
    if (map != null) {
        //获取Entry然后获取value返回
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    //没创建过就创建ThreadLocalMap
    return setInitialValue();
}

getMap()

ThreadLocalMap getMap(Thread t) {
    //获取当前线程的ThreadLocalMap对象threadLocals
    return t.threadLocals;
}
ThreadLocal.ThreadLocalMap threadLocals = null;

set()

public void set(T value) {
    //获取当前线程
    Thread t = Thread.currentThread();
    //获取当前线程ThreadLoclMap对象
    ThreadLocalMap map = getMap(t);
    //map不为空就加进去value
    if (map != null) {
        map.set(this, value);
        //map为空就创建一个map然后加进去
    } else {
        createMap(t, value);
    }
}

ThreadLocalMap 类就是 Thread.threadLocals

static class ThreadLocalMap {
    static class Entry extends WeakReference<ThreadLocal<?>> {
        Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
    //ThreadLocal:value
    private Entry[] table;
}

ThreadLocalMap 既然类似于 Map,所以就和 HashMap 一样,也会有包括 set、get、rehash、resize 等一系列标准操作。但是,虽然思路和 HashMap 是类似的,但是具体实现会有一些不同

其中一个不同点:

遇到哈希冲突TLM线性探测法HM用拉链法