【源码解析】通过源码解析 ThreadLocal 内存泄漏, 弱引用, 以及设计原因.

【代码】【源码解析】通过源码解析 ThreadLocal 内存泄漏, 弱引用, 以及设计原因.
摘要由CSDN通过智能技术生成

【源码解析】通过源码解析 ThreadLocal 内存泄漏, 弱引用, 以及设计原因.

已知

  • 每个 Thread 在创建的时候, 都会包含一个 ThreadLocalMap.
  • ThreadLocal 本质是将 value 信息存入 ThreadLocalMap 中, keyThreadLocal (弱引用), value 是强引用.
  • ThreadLocalMap 本质是采用内部实现的 Entry[] 数组存储数据 .
  • Entry 继承了 WeakReference,(弱引用本质). 其中, key 值为父类的 referent (弱引用), valueEntry 内部自定义的对象.
  • 弱引用特点: 系统 GC 的时候, 会直接回收弱引用对象.
  • ThreadLocalMapThreadLocal 的静态内部类, 外部无法直接调用.
  • ThreadLocalMap 是与 Thread 直接绑定的, 所以, 如果不是使用线程池, 是不用担心内存泄漏的, 会在 Thread 销毁的时候一并销毁

源码解析 set()

    public void set(T value) {
   
    	//获取当前线程
        Thread t = Thread.currentThread();
        //获取当前线程的 ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        if (map != null) {
   
        	//直接赋值
            map.set(this, value);
        } else {
   
        	//创建并赋值
            createMap(t, value);
        }
    }
        private void set(ThreadLocal<?> key, Object value) {
   
            Entry[] tab = table;
            int len = tab.length;
            //计算 数据存放下标
            int i = key.threadLocalHashCode & (len-1);
            // 若Entry[]数组下已经有值, 则再继续找下一个下标
            for (Entry e = tab[i];
                 e != null;
                 //如果 i 下有值已经占位, 则计算下一个坐标 计算方法 i+1
                 e = tab[i = nextIndex(i, len)])
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值