当前位置: 首页 > news >正文

ThreadLocal---java

什么是ThreadLocal

ThreadLocal 是一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,避免了线程间的资源共享和同步问题。

使用 ThreadLocal

使用 ThreadLocal 通常分为四步:

public class UserHolder {
	// 1.创建 ThreadLocal
    private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();
	// 2.设置 ThreadLocal 的值
    public static void saveUser(UserDTO user){
        tl.set(user);
    }
	// 3.获取 ThreadLocal 的值
    public static UserDTO getUser(){
        return tl.get();
    }
	// 4.删除 ThreadLocal 的值
    public static void removeUser(){
        tl.remove();
    }
}

ThreadLocal 原理

Thread 类中有一个 ThreadLocalMap 类型的属性,也就是说每个线程都有自己的 ThreadLocalMap 实例。

ThreadLocal.ThreadLocalMap threadLocals = null;
  • ThreadLocalMap 是 ThreadLocal 的静态内部类,它内部维护了一个 Entry 数组,key 是 ThreadLocal 对象
  • ThreadLocalMap 的大小是由 ThreadLocal 的数量决定的;
  • Entry 继承了 WeakReference,它限定了 key 是一个弱引用,这样的好处就是当内存不足时,JVM 会回收 ThreadLocal 对象(无外部强引用),这样可以避免 ThreadLocal 对象本身的内存泄漏
  • 当调用 set、get 和 remove 方法时,首先会根据获取当前线程,然后可以得到属性 threadLocals,将 ThreadLocal 作为 key 查询对应的 value

在这里插入图片描述

ThreadLocal 内存泄露

我们前面说过,Entry.key 是弱引用,假设一种情况,ThreadLocal 对象无外部引用(如局部变量 tl 被回收),Entry.key 变为 null,但是ThreadLocalMap 是 Thread 的字段,只要线程不结束,ThreadLocalMap 和 Value 不会被回收。Value 成为“僵尸对象”,占用内存但无法访问。

解决方案:实际应用中需要在使用完ThreadLocal变量后调用 remove() 方法释放资源

ThreadLocal 优化举例

Netty 中的 FastThreadLocal,它是 Netty 对 ThreadLocal 的优化,内部维护了一个索引常量 index,每次创建 FastThreadLocal 中都会自动+1,用来取代 hash 冲突带来的损耗,用空间换时间。

private final int index;

public FastThreadLocal() {
    index = InternalThreadLocalMap.nextVariableIndex();
}
public static int nextVariableIndex() {
    int index = nextIndex.getAndIncrement();
    if (index < 0) {
        nextIndex.decrementAndGet();
    }
    return index;
}

相关文章:

  • 016.3月夏令营:数理类
  • Redis数据结构——list
  • Cpu100%问题处理(包括-线上docker服务)
  • 从17款IT项目管理系统中挑选合适的工具
  • 【练习】【二叉树】力扣热题100 102. 二叉树的层序遍历
  • PHP之Cookie和Session
  • Java 大视界 -- Java 大数据在智慧交通信号灯智能控制中的应用(116)
  • 为解决局域网IP、DNS切换的Windows BAT脚本
  • jupyter notebook更改文件存储路径
  • 多线程-锁升级和对象的内存布局
  • [自动驾驶-传感器融合] 多激光雷达的外参标定
  • 面试基础--MySQL SQL 优化深度解析
  • 新能源汽车工厂如何通过安灯系统实现精益生产
  • [场景题]如何实现购物车
  • 给没有登录认证的web应用添加登录认证(openresty lua实现)
  • PPT小黑第26套
  • Android中的触摸事件是如何传递和处理的
  • 服务器数据恢复—raid5阵列中硬盘掉线导致上层应用不可用的数据恢复案例
  • Linux 文件和目录权限管理详解
  • JavaScript数据结构-Set的使用
  • 河南发布高温橙警:郑州、洛阳等地最高气温将达40℃以上
  • 美国务卿与以色列总理通话,讨论加沙局势
  • 原核试验基地司令员范如玉逝世,从事核试验研究超40年
  • 湖南慈利一村干部用AI生成通知并擅自发布,乡纪委立案
  • 梅花奖在上海|湘剧《夫人如见》竞梅,长沙文旅来沪推广
  • 阿联酋与美国达成超过2000亿美元协议