美文网首页一些收藏
《笔记》— ThreadLocal

《笔记》— ThreadLocal

作者: 波波维奇c | 来源:发表于2020-10-21 11:29 被阅读0次
    • 概念
      ThreadLocal是Java中一个用于线程内部存储数据的工具类。ThreadLocal是用来存储数据的,线程只能访问到自己线程存储的数据
    • 作用
      ThreadLocal的特性适用于同样的数据类型,不同的线程有不同的备份情况,这个时候就特别适合使用ThreadLocal来存储数据
    • 内部结构
      image.png
      每个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移除,防止内存泄露。
    • 总结
    1. ThreadLocal适合用于在不同线程作用域的数据备份.
    2. ThreadLocal机制通过在每个线程维护一个ThreadLocalMap,其中 ThreadLocal为Entry的key, value为ThreadLocal对应的泛型对象,这样每个ThreadLocal就可以作为key将不同的value存储在不同Thread的Map中,当获取数据的时候,同个ThreadLocal就可以在不同线程的Map中得到不同的数据

    相关文章

      网友评论

        本文标题:《笔记》— ThreadLocal

        本文链接:https://www.haomeiwen.com/subject/levzpktx.html