threadlocal 解析

目录

1.为什么要解析threadlocal

2.threadlocal 有什么用?

3.简单示例 主要就是 set ,get方法

4.源码解析

综上所述  可以总结下

5.内存泄漏问题

6.内存泄漏如何解决


1.为什么要解析threadlocal

因为经常用。。。特别的重要

2.threadlocal 有什么用?

作为每个线程 独有的本地缓存使用。。。比如用在 用户登录后保存的用户信息等

3.简单示例 主要就是 set ,get方法

package com.imooc.controller.jdk;

import com.imooc.service.impl.RedisServiceImpl;

/**
 * @description:
 * @author: yk
 * @time: 2022/5/31 9:01
 */
public class ThreadLocalTest {
    private ThreadLocal<String> threadLocal=new ThreadLocal<>();
    public static void main(String[] args) {
        ThreadLocalTest threadLocalTest=new ThreadLocalTest();
        ThreadLocal<String> threadLocal = threadLocalTest.getThreadLocal();
        threadLocal.set("ss");
        System.out.println(threadLocal.get());
    }

    public ThreadLocal<String> getThreadLocal() {
        return threadLocal;
    }

    public void setThreadLocal(ThreadLocal<String> threadLocal) {
        this.threadLocal = threadLocal;
    }
}

4.源码解析

4.1)set方法

 public void set(T var1) {
        Thread var2 = Thread.currentThread();
        ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
        if (var3 != null) {
            var3.set(this, var1);
        } else {
            this.createMap(var2, var1);
        }

    }

可以看出内部是 ThreadLocalMap在维护,再去 ThreadLocalMap 看看

 可以看出 里面又维护了 Entry[] ,再去看看 Entry

可以看出 Entry 是继承弱引用的。key 就是threadlocal,这里给包裹了一层 变成弱引用。方便垃圾回收。。。

综上所述  可以总结下

 

 thread---》ThreadLocalMap --》Entry ---》(key,value)

5.内存泄漏问题

5.1)可以看出 threadlocal 中 key是 包装成 弱引用,就是为了 垃圾回收的时候进行回收。但是如果写成强引用 垃圾就不会进行回收,造成内存泄漏

类似写成这样 就会垃圾回收(不一定跑通)

 但是如果写成强引用类型 就不会垃圾回收

 5.2)value 也可能发生内存泄漏,比如在线程池中 如果线程一直不结束,value可能会内存泄漏

。。。不演示了

6.内存泄漏如何解决

threadLocal.remove();

每次用完记得调用这个方法即可!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫大神

有帮助的话,请打赏官人一下哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值