-
概念
ThreadLocal是Java中一个用于线程内部存储数据的工具类。ThreadLocal是用来存储数据的,线程只能访问到自己线程存储的数据。 -
作用
ThreadLocal的特性适用于同样的数据类型,不同的线程有不同的备份情况,这个时候就特别适合使用ThreadLocal来存储数据 -
内部结构
每个Thread,也就是每个线程内部维护有一个ThreadLocalMap,ThreadLocalMap内部存储多个Entry。Entry可以理解为键值对,他的本质是一个弱引用,内部有一个object类型的内部变量,如下:
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
Entry是ThreadLocalMap的一个静态内部类,这样每个Entry里面就维护了一个ThreadLocal和ThreadLocal泛型对象
- 存取过程逻辑和 hashMap 比较相似
-
内存泄露问题
我们会发现Entry中,ThreadLocal是一个弱引用,而value则是强引用。如果外部没有对ThreadLocal的任何引用,那么ThreadLocal就会被回收,此时其对应的value也就变得没有意义了,但是却无法被回收,这就造成了内存泄露。怎么解决?在ThreadLocal回收的时候记得调用其remove方法把entry移除,防止内存泄露。 - 总结
- ThreadLocal适合用于在不同线程作用域的数据备份.
- ThreadLocal机制通过在每个线程维护一个ThreadLocalMap,其中 ThreadLocal为Entry的key, value为ThreadLocal对应的泛型对象,这样每个ThreadLocal就可以作为key将不同的value存储在不同Thread的Map中,当获取数据的时候,同个ThreadLocal就可以在不同线程的Map中得到不同的数据