ThreadLocal

线程什么时候会一直存在——在线程池中
1、什么是ThreadLocal?
本地线程变量。ThreadLocal用于多线程时解决数据安全的一种办法。每一个线程都绑定一个map叫做ThreadLocalMap。由于数据和线程绑定,即用map存储。键值对,故,键存储threadLocal对象,值存储数据。
2、ThreadLocal的方法
ThreadLocal threadLocal = new ThreadLocal();
常用且公开的:
threadLocal.set();//绑定数据到当前线程
threadLocal.get();//从当前线程获取数据
threadLocal.remove();//从当前线程中删除数据,防止内存泄漏
3、实现原理
Thread.currentThread() 方法得到当前线程对象假设为 t ,通过 getmap(t) 方法(此方法是ThreadLocal的一个成员属性,用default修饰,只能在当前包访问)绑定到map容器取名为 map 。然后用map(this,value)方法存储。value是当前传入的数据,this指 调用当前方法的引用对象 。也就是说,map的键存储当前ThreadLocal对象,值存储的是传入的数据。
4、ThreadLocal作用

  • 强引用、软引用、弱引用、虚引用

    • 强引用:是Java中的默认类型,当一个对象如果具有强引用,只要这种引用还存在,就不会被GC回收,甚至当内存不够时,就算抛出异常也不会对其进行回收。因为强引用不能被回收,强引用可能导致强占空间不释放,积累的多了内存泄漏会导致内存溢出,需要我们采取措施帮助GC回收。
    • 软引用:在JVM发生OOM(OutOfMemory)之前,(即内存充足的使用)是不会被GC的,只有到JVM内存不足时才会被GC。
    • 弱引用:如果一个对象只具有弱引用,那么这么对象就会被GC掉,被弱引用的对象只能生存到下一次GC发生之前,当发生GC时无论当前内存够不够,都会被GC掉。
    • 虚引用: 在任何时候都可能会被GC回收(一般不用)
  • 由于JAVA中存在垃圾回收机制,当对象不被引用后,key为null,而value还为强引用无法被垃圾回收处理。而下一次使用ThreadLocal时,会自动帮GC处理遗留的value。再传入这一次的新value。即不会造成内存泄漏同时能清理遗留的value

5、正确使用ThreadLocal

  • 每次使用完ThreadLocal都调用它的remove()方法清除数据
  • 将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉 。
    6、为什么会造成内存泄漏
    总的来说,就是当对象不被引用了,而线程一直在线程池中还没结束运行,此时,map容器里的key为null,而值还在。无法被GC,这种情况多了就会造成内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值