JDK1.8源码解读值ThreadLocal

351 阅读1分钟

概述

提供了thread-local变量。每个线程都会初始化一个完全独立的实例副本。线程结束以后。会被gc回收。ThreadLocal实例通常是被private static修饰。 使用TheadLocal实际上是避免了多线程共享的问题。

继承关系

public class ThreadLocal 没有继承接口,没有实现其他方法。默认继承自Object。

内部类

实际上是用来存储ThreadLocal值的。本质上,ThreadLocal类只是一层包装,真正的值存储在ThreadLocalMap类里。 我们可以看到ThreadLocal类的get和set方法都是调用了 ThreadLocalMap类的get和set方法。

static class ThreadLocalMap { }

构造器

public ThreadLocal() {}    

关键方法

get()

返回当前线程的thread-local变量的复制。如果没有值,就设置初始值并返回。

public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}
set()

设置当前线程的thread-local变量为指定的值。大部分子类不需要重写该方法,仅需要依赖initialValue方法去设置thread-locals的值。

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
remove()

如果有值,就移除。

public void remove() {
    ThreadLocalMap m = getMap(Thread.currentThread());
    if (m != null)
        m.remove(this);
}

要点记录

ThreadLocal 最大的特点就是线程之间不共享。值存储在内部类ThreadLocalMap中。 get和set方法的key是 ThreadLocal,value是需要存储的值。

希望和大家多多交流


我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。