《笔记》— ThreadLocal

  • 概念
    ThreadLocal是Java中一个用于线程内部存储数据的工具类。ThreadLocal是用来存储数据的,线程只能访问到自己线程存储的数据
  • 作用
    ThreadLocal的特性适用于同样的数据类型,不同的线程有不同的备份情况,这个时候就特别适合使用ThreadLocal来存储数据
  • 内部结构
    image.png

    每个Thread,也就是每个线程内部维护有一个ThreadLocalMap,ThreadLocalMap内部存储多个Entry。Entry可以理解为键值对,他的本质是一个弱引用,内部有一个object类型的内部变量,如下:
 static class Entry extends WeakReference> {
            /** 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移除,防止内存泄露。
  • 总结
  1. ThreadLocal适合用于在不同线程作用域的数据备份.
  2. ThreadLocal机制通过在每个线程维护一个ThreadLocalMap,其中 ThreadLocal为Entry的key, value为ThreadLocal对应的泛型对象,这样每个ThreadLocal就可以作为key将不同的value存储在不同Thread的Map中,当获取数据的时候,同个ThreadLocal就可以在不同线程的Map中得到不同的数据
  • 进阶:https://blog.csdn.net/bjweimengshu/article/details/93147982?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242

你可能感兴趣的:(《笔记》— ThreadLocal)