ThreadLocal实现简单剖析

直切主题

之前的threadlocal是这样的:

每一个threadlocal都有一个threadlocalmap,这个map中的元素以thread为key,待插入的值为value

现在的threadlocal是这样的:

每一个thread拥有一个threadlocalmap,这个map中的元素以threadlocal引用为key,待插入的值为value

对比:

1.可以看到,这两种实现threadlocal的方式刚好相反,那么哪一种更好一些呢,当然是后一种

2.第一点好处,之前的实现,threadlocalmap中的entry会非常多(如果thread多的话),而现在threadlocalmap中的entry会比较少(每一个thread会有很多个threadlocal吗?估计不会很多)

3.第二点好处,之前的实现,threadlocalmap会一直存在,内存消耗大,现在的实现,只要一个thread消亡了,其对应的threadlocalmap也会消亡,更加节省内存

疑问:

有一种说法,由于threadlocalmap中以threadlocal 弱引用为key,当threadlocal被回收后,其对应的value不会被回收,则会引起内存泄漏?其实不然,看threadlocal的get函数源码,就会发现,当查找的时候,如果查找到key为null,则会将对应的value也置位null,然后继续往下找,这样value值也会为null,就会被gc掉了。

当然,这种情况有个前提,就是要调用threadlocal的get或者set方法,为了避免别的情况引起内存泄漏,jdk建议将threadlocal设置为 private static类型,这样threadlocal就会存在相当长的时间,就可以在调用threadlocal的remove方法时,将entry删掉,从而尽量避免其他情况下的内存泄漏

主要使用:

1.threadlocal的set方法,调用时,先根据thread获得threadlocalmap,然后再根据threadlocal为key,插入value;若获得threadlocalmap为null,则创建threadlocalmap,插入<threadlocal引用,value>

2.threadlocal的get方法,调用时,先根据thread获得threadlocalmap,然后再根据threadlocal为key,获取value;若获得threadlocalmap为null或者通过threadlocal获得entry为null,则创建threadlocalmap,并返回默认值


最后,不免有错误,希望大家指正


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值