栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

threadlocal 解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;


public class ThreadLocalTest {
    private ThreadLocal threadLocal=new ThreadLocal<>();
    public static void main(String[] args) {
        ThreadLocalTest threadLocalTest=new ThreadLocalTest();
        ThreadLocal threadLocal = threadLocalTest.getThreadLocal();
        threadLocal.set("ss");
        System.out.println(threadLocal.get());
    }

    public ThreadLocal getThreadLocal() {
        return threadLocal;
    }

    public void setThreadLocal(ThreadLocal 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();

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/939699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号