TheadLocal GC时一定会被回收?

概要

    一说到TheadLocal首先想到的是线程安全,其次是内存泄漏.内存泄漏是因为弱引用导致,弱引用在GC的时候key会被回收,但是value没有被回收,这样就会导致value一直占用内存空间内存泄漏.不知道大家第一次看到这个概念时有没有这样一个疑惑? 我前脚刚用TheadLocal设置一个值,后脚GC就给清了,那后面我不是用不了?那这种设计不是有毛病?其实不然,往下看.

测试代码

@RestController
public class DemoController {

	@RequestMapping("/test1")
	public void test1() throws Exception {


		Node node = new Node("xxx");
		// 强引用
		ThreadLocal<Node> test = new ThreadLocal<>();
		test.set(node);
		// 此时gc 无法回收 threadLocalMap entry table 的 弱引用 key
		System.gc();
		// 等待gc 调度
		Thread.sleep(60000);

		// 用来debug查看 threadLocalMap 中entry table情况
		ThreadLocal<Node> test23 = new ThreadLocal<>();
		Node node23 = new Node("xxx1");
		test23.set(node23);

		// 置空 断开强引用
		test = null;
		System.gc();
		Thread.sleep(60000);

		// 用来debug查看 threadLocalMap 中entry table情况
		ThreadLocal<Node> test24 = new ThreadLocal<>();
		Node node24 = new Node("xxx2");
		test24.set(node24);

	}
}

测试场景

场景一: 触发GC但ThreadLocal不置为空

结果: ThreadLocal 没有被回收

在这里插入图片描述
在这里插入图片描述

场景二: 触发GC但ThreadLocal置为空

结果: ThreadLocal 被回收了

在这里插入图片描述
在这里插入图片描述

小结

   当且仅当ThreadLocal只有弱引用时触发GC时ThreadLocal会被回收.
  如果ThreadLocal是全局变量用来储存用户登录信息等此时是ThreadLocal有强引用不会被回收.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocalJava中的一个类,用于实现线程局部变量。它可以在每个线程中创建一个变量的副本,每个线程对该副本进行操作,互不影响。 当线程第一次调用ThreadLocal的set或者get方法创建一个threadLocals变量,用于存储该线程的本地变量。具体而言,ThreadLocal实例本身相当于一个装载本地变量的工具壳,通过set方法将值添加到调用线程的threadLocals中,当调用线程调用get方法,能够从自己的threadLocals中取出该变量。 在get方法的实现中,首先获取当前调用线程,如果当前线程的threadLocals不为null,就直接返回当前线程的threadLocals变量中的本地变量值,否则执行setInitialValue方法来初始化threadLocals变量。 需要注意的是,如果调用线程一直不终止,那么该本地变量将一直存放在threadLocals中,可能导致内存溢出。因此,在使用完ThreadLocal后,需要调用remove方法将该线程的threadLocals中的本地变量删除。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ThreadLocal详解](https://blog.csdn.net/m0_49508485/article/details/123234587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值