概述
提供了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开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。