zoukankan      html  css  js  c++  java
  • ThreadLocal分析总结:

    • 1、ThreadLocal 是什么
      • 它是一个数据结构,像 HashMap,可保存 "key : value" 键值对;
        ThreadLocal 有一个内部类ThreadLocalMap,用于存储数据。
      • 但一个 ThreadLocal 只能保存一个,并且各个线程的数据互不干扰。
    • 2、ThreadLocalMap
      • 在 ThreadLoalMap 中,初始化一个大小 16 的 Entry 数组;
      • Entry 对象用来保存每一个 key-value 键值对,只不过这里的 key 永远都是 ThreadLocal 对象;
      • 通过 ThreadLocal 对象的 set 方法,结果把 ThreadLocal 对象自己当做 key,放进了 ThreadLoalMap 中。
    • 3、hash冲突解决:
      • 线性探测,步长加 1 或减 1。代码是在set和getEntry方法中(nextIndex方法)
    • 4、内存泄漏?
      • 产生原理?
        • ThreadLocalMap中的key是ThreadLocalMap自己,是弱引用。
          见代码实现,Entry extends了WeakReference,还在代码中调用super方法,将key设置为弱引用。
        • ThreadLocal 在没有外部对象强引用时,发生 GC 时弱引用 Key 会被回收,而 Value 不会回收,如果创建 ThreadLocal 的线程一直持续运行,那么这个 Entry 对象中的 value 就有可能一直得不到回收,发生内存泄露。
      • 解决:
        • 使用完 ThreadLocal 之后,显示调用 remove 方法。将 Entry 节点和 Map 的引用关系移除,这样整个 Entry 对象在 GC Roots 分析后就变成不可达了,下次 GC 时就可以被回收。
          注:要是renove之后还要使用怎么办?
    • 5、总说明:
      • 1、Thread里定义的对象是ThreadLocal.ThreadLocalMap,不是ThreadLocal。
      • 2、每个线程中调用ThreadLocal的get和set方法,实际是对当前Thread里的ThreadLocalMap进行操作
      • 3、每个线程里可以新建多个ThreadLocal,每次调用时set值,用该ThreadLocal作为key。
        • 每个 ThreadLocal 对象都有一个 hash 值 threadLocalHashCode,每初始化一个 ThreadLocal 对象,hash 值就增加一个固定的大小 0x61c88647。
        • 底层原理和hashMap很像,根据哈希值寻找数组索引,然后取值和设置值。
      • 4、ThreadLocalMap内部是用Entry 数组存储数据。
    • 6、参考:
  • 相关阅读:
    skywalking简介
    .Net Core微服务——Consul(4):搭建集群
    .Net Core微服务——Consul(3):健康检查
    .Net Core微服务——Consul(2):自动扩展、服务调用
    .Net Core微服务——Consul(1):服务发现
    SpringBoot数据访问之整合Mybatis配置文件
    SpringBoot数据访问之Druid启动器的使用
    SpringBoot数据访问之Druid数据源的自定义使用
    Spring Boot核心技术之Restful映射以及源码的分析
    SpringBoot之yaml语法及静态资源访问
  • 原文地址:https://www.cnblogs.com/buwuliao/p/10648215.html
Copyright © 2011-2022 走看看