关于ThreadLocal的理解

为什么threadLoacl要设计改为thread类里面有threadLocalMap?

为什么threadLoacl要设计改为thread类里面有threadLocalMap,然后map里面key为threadLoacl,value为value,而不是一个threadLoaclMap里面根据thread当key呢。

其实在早起jdk版本就是用后者,后来改成了前者。

主要原因:

1、减少hash冲突。这样把每个thread分多个map,可以减少每个map的存储数据,从而提高查询效率。

2、节省内存。最主要的还是因为thread里面放map,可以在thread销毁的时候自动删除map和里面的threadLocal这些,更节省内存。

ThreadLoaclMap到底是什么结构?

threadLoaclMap其实不是map,而是threadLoacl里面的内部类,map里面有个entry对象,就是key和value的形式,这个key定死了只能是threadloacl对象,而且是弱引用,为了让线程的生命周期和threadlocal解绑,下面会说。

Threadlocal的弱引用(重点)

Threadlocal的内存泄漏其实跟弱引用没有关系,不管key是不是弱引用,他的value都会发生内存泄漏的,如果没有remove掉entry对象的话,所以如果我们用完threadlocal记得romove掉,要不然就只能等thread类销毁,然后他的map这些都会销毁了,用了线程池是很难达成的。

为什么key需要弱引用

因为threadlocal源码中的get、set方法里会对如果key为null,value也为null这种操作,是可以来防止内存泄露的,也就是当年让家remove掉entry的时候,弱引用其实可以提供一个保障

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卒获有所闻

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值