【ThreadLocal实现原理】

首先呢threadlocal是一种线程的隔离机制,也是为了解决多线程访问共享变量的安全问题。

当多线程访问共享变量时,为了保证线程安全,我们平时都是对这个共享变量进行加锁,来保证每次都只有一个线程能够访问修改共享变量。但是呢,加锁会带来性能的下降,ThreadLocal能够保证线程安全的同时,提升性能。ThrealLocal是一种以空间换时间的设计思想来保证线程安全和提升性能,通过在线程内部维护一个容器,来存储共享的副本,每次访问时呢,先去拷贝一份共享变量,然后只对自己这个共享变量副本进行操作,来保证线程安全。

ThreadLocal的实现原理呢就是在Thread类内部维护一个ThreadLocals变量,其类型时ThreadLocalMap类型,然后用这个ThreadLocalMap来保存共享变量的副本,后续线程的对共享变量的操作都是对这个Map里面的共享变量的操作,不会影响到全局变量。

为什么说会产生内存泄漏问题?

ThreadLocalMap内部维护了一个Entry类型的数组,用来存放key,value值,这个key值,存放的是父类ThreadLocal的引用,value存储的是共享变量,这个Entry实现了WeakReference,这个一个弱引用,注意构造函数里的 第一行代码 super(k),这意味着 ThreadLocal 对象也是一个「弱引用」,而弱引用呢,不管下次内存是否足够,下次GC一定会被回收,由于 ThreadLocal 对象是弱引用,如果外部没有强引用指向它,它就会被 GC 回收,导致 Entry 的 Key 为空(null),如果这时 Value 外部也没有强引用指向它,那么 Value 就永远也访问不到了,按理也 应该被 GC 回收,但是由于 Entry 对象还在强引用 Value,导致 Value 无法被回收,这时「内存泄漏」 就发生了,Value 成了一个永远也无法被访问,但是暂时又无法被回收的对象。那么就需要等待线程结束后才能被回收,但是我们的线程在项目中并不会频繁的被创建和销毁,一般都会用到线程池,所有呢这个value值会长期的占用内存而无法被回收,造成这个内存泄漏

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值